我有一段关键的代码,只能由一个进程运行。为了确保机器上只有一个进程运行这个关键块,我使用一个全局互斥锁(Mutex)。关键部分的代码使用了async/await。总体来说,代码大致如下:
var mutex = new Mutex(false, @"Global\MyMutexName");
mutex.WaitOne(-1, false);
SetupASystemWideResource()
await DoSomeAsyncWorkOnThatResource();
mutex.ReleaseMutex();
问题在于await后面的代码可能会在不同的线程上执行。因此,互斥锁可能会在不同于获取它的线程上被释放。这会导致异常。
System.ApplicationException: Object synchronization method was called from an unsynchronized block of code.
通常情况下,这是有道理的,因为您不希望一个不同的线程释放互斥锁而不是获取它。但是在我的情况下,我只是想防止第二个应用程序实例在第一个实例使用它时以不同的方式设置系统资源。该资源本身可以在同一实例中的多个线程中使用。
正确的方法是如何确保这一点并异步地完成工作呢?