C# · 12月 26, 2021

c# – 我应该处理互斥体吗?

我正在使用两个 Windows服务,其中有一个通常的数据库,我想用一个系统Mutex来锁定(跨进程).

现在我想知道是否可以在try-finally块中调用WaitOne()和ReleaseMutex(),或者我也应该处理Mutex(例如在使用块中).如果是这样,我想我应该总是在WaitOne()方法上捕获AbandonedMutexException,或者我在这里错了?

解决方法 互斥是Windows内核对象(这里包含在.NET对象中).

因此,它是一个非托管资源,应该处理.

更准确地说,.NET对象包含一个互斥体的HANDLE,它必须以某种方式被释放/处置.

我不相信那个互斥体对象没有处理的那个code sample in the Mutex class docs.虽然Henzi在评论中有一个很好的意见:Mutex对象是静态的,并且将由终结器处理或在进程退出时由Windows内核销毁.

另外,请注意,Close()也处理对象.

当然,即使你不使用它,在你的应用程序中保留一个现有的Mutex对象就没有任何问题.他们是轻的资源.