Thread.sleep в asp.net

Я имитирую протокол прямой трансляции кометы для своего сайта, поэтому в своем контроллере я добавляю:

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

Но я заметил, что весь сайт стал работать медленно после добавления этой функции. После отладки я пришел к выводу, что при вызове Thread.Sleep все потоки, даже в других запросах, блокируются.

Почему Thread.Sleep блокирует все потоки, а не только текущий, и как мне решить такую проблему?

Ответ 1

Что @Servy сказал правильно. В дополнение к его ответу я хотел бы бросить свои 2 цента. Бьюсь об заклад, вы используете сеансы ASP.NET, и вы отправляете параллельные запросы с одного сеанса (например, вы отправляете несколько запросов AJAX). За исключением того, что сеанс ASP.NET не является потокобезопасным, и вы не можете иметь параллельные запросы из того же сеанса. ASP.NET просто сериализует вызовы и выполняет их последовательно.

Вот почему вы наблюдаете эту блокировку. Он будет блокировать только запросы с одного сеанса ASP.NET. Если вы отправляете HTTP-запросы с другого сеанса, он не будет блокироваться. Это поведение по дизайну, и вы можете больше узнать об этом here.

Сеансы ASP.NET похожи на рак, и я рекомендую отключить их, как только вы узнаете, что они используются в веб-приложении:

<sessionState mode="Off" />

Больше нет очереди. Теперь у вас есть масштабируемое приложение.

Ответ 2

Я пришел к выводу, что когда я вызываю thread.sleep, все потоки даже в других запросах блокируются

Этот вывод неверен. Thread.Sleep не блокирует какой-либо другой поток, он только блокирует текущий поток. Если несколько потоков блокируются этой строкой кода, это происходит потому, что все эти потоки попадают в эту строку кода.