我的互斥锁坏了

本文关键字:坏了 我的 | 更新日期: 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。

我一定是用错了

我的互斥锁坏了

awaitMutex不兼容。你可以使用一个异步兼容的互斥锁,如SemaphoreSlimAsyncLock,我有作为我的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();
  }
}