2010-10-21 135 views
3

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

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

或者

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

回答

4

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

2

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

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

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