C# 在IPC中使用带命名互斥体的WaitOne时,可以使用空while块吗?
基本上,同一流程的多个实例将执行以下操作:C# 在IPC中使用带命名互斥体的WaitOne时,可以使用空while块吗?,c#,.net,windows,multithreading,ipc,C#,.net,Windows,Multithreading,Ipc,基本上,同一流程的多个实例将执行以下操作: using (var mutex = new System.Threading.Mutex(false, MUTEX_NAME)) { while (!mutex.WaitOne(100)) { /* wait to acquire mutex from other process */ } try { doSynchronizedWork(); } finally {
using (var mutex = new System.Threading.Mutex(false, MUTEX_NAME))
{
while (!mutex.WaitOne(100)) { /* wait to acquire mutex from other process */ }
try
{
doSynchronizedWork();
}
finally
{
mutex.ReleaseMutex();
}
}
会不会有陷阱?进程是否可以在不释放互斥锁的情况下退出?如果发生这种情况,放弃的mutexception
会实际抛出吗?或者另一个进程只是获取互斥锁?还有别的吗
编辑:
看起来正确的方法应该是(至少在我的场景中)这样做:
using (var mutex = new System.Threading.Mutex(false, MUTEX_NAME))
{
bool lockObtained = false;
while (!lockObtained)
{
try
{
while (!mutex.WaitOne()) { /* wait to acquire mutex */ }
lockObtained = true;
}
catch (AbandonedMutexException ignored)
{
// mutex abandoned by another
// process before that process completed.
// We can now try to obtain it again.
}
}
try
{
doSynchronizedWork();
}
finally
{
mutex.ReleaseMutex();
}
}
这有什么意义?只需等待,无需超时 当进程退出时,所有资源都将被清理。必须假设在IPC场景中能够发生
放弃的MutexException
,因为其他进程可能随时失败(由于错误或内存不足等原因)
如果您这样做是因为
Thread.Abort
工作:Thread.Abort
非常危险。请留下评论,我将能够帮助您迁移到更好的位置。如果您的线程可以等待足够的时间,您可以调用将系统资源分配给另一个线程。