我正在模拟我的网站的彗星活动饲料协议,所以在我的控制器中我添加
while(nothing_new && before_timeout){ Thread.Sleep(1000); }
但是我注意到,我添加了这个功能后,整个网站都慢了.调试之后,我得出结论,当我调用Thread.Sleep所有的线程,即使在其他请求,被阻止.
为什么Thread.Sleep阻止所有的线程,不仅是当前的,以及如何处理这样的问题?
解决方法
@Servy说的是正确的除了他的答案,我想扔我的2美分.我敢打赌,你正在使用ASP.NET Sessions,并且你正在从同一个会话发送并行请求(例如你发送多个AJAX请求).除了ASP.NET Session不是线程安全的,你不能有来自同一会话的并行请求. ASP.NET将简单地序列化调用并依次执行它们.
这就是为什么你正在观察这个阻挡.它将阻止来自同一ASP.NET会话的请求.如果您从不同的会话发送HTTP请求,则不会阻止.这种行为是设计的,你可以阅读更多关于它here
.
ASP.NET会话就像一个癌症,我建议您一旦发现它们被用于Web应用程序,就会禁用它们:
<sessionState mode="Off" />
不再排队现在你有一个可扩展的应用程序.