Функция run()
в следующем коде вызывается из других потоков одновременно. В любое время в любой строке может возникнуть исключение ThreadAbortException в соответствии с общим дизайном приложения, которое я не могу изменить.
Иногда я получаю SemaphoreFullException
при вызове pool.Release()
. Я думаю, что это происходит, если исключение прерывания потока происходит при вызове "pool.WaitOne ()". Во время моих попыток отладки, после возникновения SemaphoreFullException, нет проблем с запуском кода. После этого исключения pool.WaitOne()
вызовы и другие вещи работают так, как и ожидалось.
Я не смог получить тупиковую ситуацию во время моих локальных сеансов отладки. Однако на удаленном компьютере у меня тупик с этим кодом. Я присоединяю этот процесс с помощью удаленного отладчика и вижу, что выполнение заблокировано в строке pool.WaitOne();
.
Я не могу понять, как это произойдет, и что я делаю неправильно. Любая помощь очень ценится.
private static object poolLocker = new object();
private static Semaphore _pool;
private static Semaphore pool
{
get
{
if (_pool == null)
lock (poolLocker)
if (_pool == null)
{
int count = myMaximumThreadCount;
_pool = new Semaphore(count, count);
}
return _pool;
}
}
private void run()
{
try
{
pool.WaitOne();
do_something_that_may_throw_exception();
}
finally
{
try
{
pool.Release();
}
catch (SemaphoreFullException) { }
}
}