我的互斥锁坏了
本文关键字:坏了 我的 | 更新日期: 2023-09-27 18:12:59
private static bool Created;
private static System.Threading.Mutex PaintGuard = new System.Threading.Mutex(false, "MonkeysUncleBob", out Created);
//Function that is attached to each pages "LayoutUpdated" call.
private async void AnyPageLayoutUpdated(object sender, object e)
{
if (Created)
{
PaintGuard.WaitOne();
try
{
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
LCDDriver.ILI9488.PaintScreen(sender);
});
}
catch (Exception f)
{
}
finally
{
PaintGuard.ReleaseMutex();
}
}
}
问题是,不知何故,多个线程仍然可以进入代码。我已经通过使用调试器验证了这一点,并且我可以看到在执行finally之前有多个线程进入try。
我一定是用错了
await
与Mutex
不兼容。你可以使用一个异步兼容的互斥锁,如SemaphoreSlim
或AsyncLock
,我有作为我的AsyncEx库的一部分。
由于注释而更新:
由于您在UI线程上,因此不需要调用调度器。你只需要一个SemaphoreSlim
来保持它们一次一个:
private readonly SemaphoreSlim _mutex = new SemaphoreSlim(1);
//Function that is attached to each pages "LayoutUpdated" call.
private async void AnyPageLayoutUpdated(object sender, object e)
{
await _mutex.WaitAsync();
try
{
LCDDriver.ILI9488.PaintScreen(sender);
}
finally
{
_mutex.Release();
}
}