重置信号量

时间:2010-10-21 16:14:17

标签: c# multithreading

重置具有等待线程的信号量的最佳方法是什么?现在,我能想到的只是做一个while循环并释放信号量,直到发生信号量完全异常。我不确定最佳做法是什么。

semaphore.Close();
semaphore = new Semaphore(0,1);

或者

while(true)
{
   try
   {
      semaphore.Release();
   }
   catch
   {
      break;
   }
}
semaphore = new Semaphore(0,1);

2 个答案:

答案 0 :(得分:4)

如果你想这样做,你确定要开始Semaphore吗?或许ManualResetEvent会更合适吗?

答案 1 :(得分:2)

除了执行您显示的循环之外,没有其他方法可以确保现有的信号量已满。如果你真的想这样做,那么你的方法就是这样。但是,您可能应该将catch更改为catch (SemaphoreFullException)

也就是说,做你正在谈论的事情有特别的危险。如果某个其他线程在你开始填充之前已经获取了信号量,或者在你尝试填充信号量时在信号量上执行了WaitOne,那么当该线程执行Release时,它将获得SemaphoreFullException

如果你正在“重置”你的程序以准备开始一个新的运行或某事,那么你的第一个例子是要走的路:破坏信号量并创建一个新的信号量。当然,在执行此操作之前,您需要确保没有任何活动线程需要使用旧信号量。 。