【发布时间】:2019-02-05 03:52:58
【问题描述】:
我有一段代码应该一次只能由一个进程运行。为了确保机器上只有一个进程在运行这个关键块,我使用了全局互斥锁。关键部分的代码使用 async/await。总体而言,代码如下所示:
var mutex = new Mutex(false, @"Global\MyMutexName");
mutex.WaitOne(-1, false);
SetupASystemWideResource()
await DoSomeAsyncWorkOnThatResource();
mutex.ReleaseMutex();
问题是等待之后的代码可能发生在不同的线程上。因此,互斥锁可能会在与获取的线程不同的线程上释放。这会导致异常
System.ApplicationException: Object synchronization method was called from an unsynchronized block of code.
通常这是因为您不希望使用不同的线程来释放互斥锁而不是获取它。但是在我的情况下,我真的只对防止应用程序的第二个实例在第一个实例使用它时以不同的方式设置系统资源感兴趣。资源本身可以在一个实例中的多个线程中使用。
确保这一点并异步完成工作的正确方法是什么?
【问题讨论】:
-
你能在 UI 线程上做到这一点吗(假设 WinFroms/WPF)?
标签: c# async-await mutex