重置具有等待线程的信号量的最佳方法是什么?现在,我能想到的只是做一个while循环并释放信号量,直到发生信号量完全异常。我不确定最佳做法是什么。
semaphore.Close();
semaphore = new Semaphore(0,1);
或者
while(true)
{
try
{
semaphore.Release();
}
catch
{
break;
}
}
semaphore = new Semaphore(0,1);
答案 0 :(得分:4)
如果你想这样做,你确定要开始Semaphore
吗?或许ManualResetEvent
会更合适吗?
答案 1 :(得分:2)
除了执行您显示的循环之外,没有其他方法可以确保现有的信号量已满。如果你真的想这样做,那么你的方法就是这样。但是,您可能应该将catch
更改为catch (SemaphoreFullException)
。
也就是说,做你正在谈论的事情有特别的危险。如果某个其他线程在你开始填充之前已经获取了信号量,或者在你尝试填充信号量时在信号量上执行了WaitOne
,那么当该线程执行Release
时,它将获得SemaphoreFullException
。
如果你正在“重置”你的程序以准备开始一个新的运行或某事,那么你的第一个例子是要走的路:破坏信号量并创建一个新的信号量。当然,在执行此操作之前,您需要确保没有任何活动线程需要使用旧信号量。 。