【发布时间】:2014-12-15 13:49:06
【问题描述】:
这是我的代码使方法调用互斥
public class X
{
private static Mutex mutex = new Mutex(true, "MutexForFile");
public IList<string> DoIt(IList<string> documents)
{
var result = new List<string>();
if (mutex.WaitOne())
{
using (var agent = new MyClass())
{
// operation login
if (agent.LibraryLogon("**", "***"))
{
try
{
//codes to access shared resource
}
catch (Exception e)
{
Log.ErrorFormat("");
}
finally
{
if (!mutex.SafeWaitHandle.IsClosed)
{
mutex.ReleaseMutex();
}
mutex.Dispose();
}
Log.DebugFormat("Completed");
}
else
{
throw new Exception("Unable to Login Session");
}
}
Log.DebugFormat("Completed Do it");
}
return result;
}
}
我不得不检查 if (!mutex.SafeWaitHandle.IsClosed),因为当我调用 mutex.ReleaseMutex() 时收到 ObjectDisposedException 说“安全句柄已关闭”。
这是避免这种异常的正确方法吗?
任何一次都可以表明此代码存在任何缺陷或问题吗?
【问题讨论】:
-
我建议阅读 MSDN 上有关构造函数的 Mutex 类的文档。特别是
Mutex(bool initiallyOwned, string name)和Mutex(bool initiallyOwned, string name, out bool creatNew)最简单的解决方法可能是使用 intiallyOwned = false 而不是 true 来初始化互斥锁。然后,您应该能够在 finally 语句中删除 if 块。我还没有验证这一点,而且我已经很长时间没有使用 .Net 互斥锁了,但是,我认为这将解决问题。根据您对互斥锁的全部使用情况,您可能需要进行更多处理。 -
为方便起见的文档:msdn.microsoft.com/en-us/library/…
-
我试过这个,但对我没有帮助
-
在你调用了 mutex.Dispose() 之后,你再也不能使用 X 类了。无论如何,您都会这样做,这就是导致异常的原因。您还在摸索 ReleaseMutex() 调用,它必须在您调用 WaitOne() 后无条件调用。代码从根本上以不止一种方式被破坏,显然你必须重新考虑这一点。
-
我应该如何重新排列这些代码?