15

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

while(nothing_new && before_timeout){
  Thread.Sleep(1000);
}

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

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

4

2 回答 2

28

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

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

ASP.NET 会话就像癌症一样,我建议您在发现它们正在 Web 应用程序中使用它们时立即禁用它们:

<sessionState mode="Off" />

不用排队了。现在您有了一个可扩展的应用程序。

于 2013-04-02T14:48:54.123 回答
8

我得出的结论是,当我调用 thread.sleep 时,即使在其他请求中的所有线程都被阻塞了

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

于 2013-04-02T14:45:08.007 回答