【发布时间】:2020-06-09 01:01:10
【问题描述】:
以下代码中的run() 函数同时从其他线程调用。根据应用程序的一般设计,在任何时候,任何行都可能发生 ThreadAbortException,这是我无法更改的。
我有时会在拨打pool.Release() 时收到SemaphoreFullException。我认为如果在调用“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) { }
}
}
【问题讨论】:
-
静默隐藏异常的代码(空的
catch块)不会帮助您进行调查 -
@Damien_The_Unbeliever 谢谢你的建议。我更改了该部分只是为了捕获 SemaphoreFullException,并且在远程计算机上发生了相同的死锁。报告所有未处理的异常;没有报告异常。