asp.net中的thread.sleep

Hil*_*lmi 13 c# asp.net asp.net-mvc-4

我正在为我的网站模拟彗星实时馈送协议,因此在我的控制器中我添加:

while(nothing_new && before_timeout){
  Thread.Sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)

但是我注意到在添加此功能后整个网站变慢了.调试后我得出结论,当我调用Thread.Sleep所有线程时,即使在其他请求中,也被阻止.

为什么要Thread.Sleep阻止所有线程,而不仅仅是当前线程,以及我应该如何处理这样的问题?

Dar*_*rov 25

@Servy说的是正确的.除了他的答案,我想扔2美分.我敢打赌你正在使用ASP.NET Sessions,并且你正在从同一个会话发送并行请求(例如,你发送了多个AJAX请求).除了ASP.NET会话不是线程安全的,并且您不能从同一会话获得并行请求.ASP.NET将简单地序列化调用并按顺序执行它们.

这就是你观察这种阻塞的原因.它将仅阻止来自同一ASP.NET会话的请求.如果您从其他会话发送HTTP请求,它将不会阻止.此行为是设计使然,您可以阅读更多相关信息here.

ASP.NET会话就像一个癌症,我建议你在发现它们被用于Web应用程序时立即禁用它们:

<sessionState mode="Off" />
Run Code Online (Sandbox Code Playgroud)

不再排队.现在你有了一个可扩展的应用程序.


Ser*_*rvy 8

我总结说,当我调用thread.sleep时,即使在其他请求中,所有线程都被阻止

这个结论是不正确的. Thread.Sleep不阻止任何其他线程,它只阻止当前线程.如果多行代码都被这行代码阻塞,那么这是因为所有这些线程都在使用这行代码.

  • @Hilmi不,你的结论不正确.`Thread.Sleep`不会阻塞任何其他线程,它只会阻塞单个线程.所有其他线程都在阻塞,因为他们正在等待这个线程,而不是因为他们正在执行sleep命令.这是完全不同的东西. (2认同)