Как безопасно использовать WaitHandles для предотвращения взаимных блокировок? - PullRequest
1 голос
/ 20 февраля 2009

Обратите внимание на следующее псевдо:

ManualResetEvent[] resetEvents = new ManualResetEvent[operations.Count];

for( int i = 0; i < operations.Count; i++ )
{
  resetEvents[i] = new ManualResetEvent(false);
  ThreadPool.QueueUserWorkItem(new WaitCallback(timeConsumingOpHandler), resetEvents[i]);
}

WaitHandle.WaitAll(resetEvents);

В случае возникновения исключения в одном из объединенных потоков мой ASP.NET WebApp блокируется. Никакая информация об исключениях не передается в потоке ответа. Я ищу предложения, чтобы предотвратить это. Фиксированный тайм-аут приемлем. Предположим, что timeConsumingOpHandler Set () - это WaitHandle.

Весь timeConsumingOpHandler обернут в блок try-catch-finally, где WaitHandle установлен Set () во время раздела finally. Тем не менее, возникает тупик.

Ответы [ 3 ]

1 голос
/ 20 февраля 2009

Вы уверены, что находитесь в тупике? В .NET 2.0 необработанные исключения в ThreadPool завершают процесс .

Не следует использовать ThreadPool в приложениях ASP.NET. ASP.NET сам использует ThreadPool для обслуживания запросов, поэтому вы конкурируете за один и тот же набор потоков. Если вам необходимо асинхронное выполнение, используйте асинхронный делегат.

0 голосов
/ 20 февраля 2009

Возможно, вы захотите взглянуть на пользовательский хост CLR на MSDN, который Джо Даффи разработал для автоматического обнаружения взаимоблокировок.

0 голосов
/ 20 февраля 2009

Любая операция блокировки является потенциальной тупиковой ситуацией. Есть способы, которыми вы можете минимизировать или практически исключить вероятность возникновения тупика (если вы всегда будете следить за тем, чтобы ваши синхронизированные операции заканчивались за определенное время), но в общем случае вы не можете просто предполагать, что есть безопасный способ предотвратить тупики.

Тайм-аут имеет большое значение для обеспечения того, чтобы ваше приложение не зашло в тупик, но тогда у вас будет остановка, и вам нужно будет восстановиться после тайм-аута исключительным образом. Тот же поток программы больше не применяется.

Если у вас есть потоки, которые генерируют исключения, проверьте окно «Отладка> Вывод» в Visual Studio, и кажется, что оно всегда перехватывает исключение, даже если отладчик не прерывается при работе с несколькими потоками.

Похоже, вы разделяете работу на отдельные потоки для достижения параллелизма. Зачем вам это нужно в приложении ASP.NET?

...