如果需要跨进程同步,则应该只使用互斥锁.
虽然互斥锁可以用于进程内线程同步,但通常首选使用Monitor,因为监视器是专门为.NET Framework设计的,因此可以更好地利用资源.相反,Mutex类是Win32构造的包装器.虽然它比监视器更强大,但互斥锁需要互操作转换,这些转换的计算成本比Monitor类所需的更高.
如果需要支持进程间锁定,则需要Global mutex.
使用的模式非常脆弱,没有异常处理,并且您无法确保释放Mutex.这是非常危险的代码,并且很可能是您在没有超时时看到这些代码挂起的原因.
此外,如果您的文件操作时间超过1.5秒,那么并发互斥锁将无法抓取它.我建议正确锁定并避免超时.
我认为最好重新写这个来使用锁.此外,看起来你正在呼唤另一种方法,如果这需要永远,锁将永远保持.那是非常危险的.
这既短又安全:
// if you want timeout support use // try{var success=Monitor.TryEnter(m_syncObj, 2000);} // finally{Monitor.Exit(m_syncObj)} lock(m_syncObj) { l.LogInformation( "Got lock to read/write file-based server state." , (Int32)VipEvent.GotStateLock); using (var fileStream = File.Open( ServerState.PATH, FileMode.OpenOrCreate , FileAccess.ReadWrite, FileShare.None)) { // the line below is risky, what will happen if the call to invoke // never returns? result = func.Invoke(fileStream); } } l.LogInformation("Released state file lock.", (Int32)VipEvent.ReleasedStateLock); return true; // note exceptions may leak out of this method. either handle them here. // or in the calling method. // For example the file access may fail of func.Invoke may fail