C# 不阻止当前(UI)线程的互斥体

C# 不阻止当前(UI)线程的互斥体,c#,wpf,multithreading,asynchronous,async-await,C#,Wpf,Multithreading,Asynchronous,Async Await,我有一个小任务-我必须使用tasks和async\await创建互斥体,这不会阻塞当前的threadUI线程 互斥接口: Lock–返回一个任务,该任务只有在互斥锁变为空闲时才能完成。这项任务必须完成 每个锁唯一,每个释放调用不允许超过1个解锁。 释放–释放互斥。锁返回的任务中只有一个必须完成。 互斥必须以这种方式工作 await mutex.Lock(); // critical code mutex.Release(); 最后我写了一些codesee链接,但如果简单描述一下问题: 我创

我有一个小任务-我必须使用tasks和async\await创建互斥体,这不会阻塞当前的threadUI线程

互斥接口:

Lock–返回一个任务,该任务只有在互斥锁变为空闲时才能完成。这项任务必须完成 每个锁唯一,每个释放调用不允许超过1个解锁。 释放–释放互斥。锁返回的任务中只有一个必须完成。 互斥必须以这种方式工作

await mutex.Lock();
// critical code  
mutex.Release();
最后我写了一些codesee链接,但如果简单描述一下问题: 我创建了一个类互斥体。 在方法锁中,我执行以下操作:

await Task.Factory.StartNew(() =>
{
    mutex.WaitOne();
    UserDispatcher = Dispatcher.CurrentDispatcher;
});
if (mutex != null && UserDispatcher != null)
{
    UserDispatcher.Invoke(new Action(() =>
    {
        Console.WriteLine("Releasing");
        mutex.ReleaseMutex();
    }));
}
在方法版本中,我做了如下操作:

await Task.Factory.StartNew(() =>
{
    mutex.WaitOne();
    UserDispatcher = Dispatcher.CurrentDispatcher;
});
if (mutex != null && UserDispatcher != null)
{
    UserDispatcher.Invoke(new Action(() =>
    {
        Console.WriteLine("Releasing");
        mutex.ReleaseMutex();
    }));
}
当我试图释放互斥时,我的程序就永远冻结了。什么问题

完整代码:


链接到项目:

当UI线程在mutex.WaitOne上等待释放互斥时,您可能会遇到死锁;您试图使用相同的UI线程释放它,该线程被发布mutex.ReleaseMutex阻止;在它上面使用调度程序

如果您想要一个异步互斥,您可以简单地使用设置为1的信号量lim,因此,互斥和调用WaitAsync来异步等待


这是我的异步锁实现,它与使用信号量LIM的异步互斥锁相同。

这里有一个小问题。。。我的互斥锁必须以等待互斥锁的方式工作。Lock,我不能那样做semaphore@progerz您可以使用SemaphoreSlim和WaitAsync。@i3aron,它将以这种方式工作吗?你有Skype或其他messenger吗?关于这一点,我只有几个小问题。@progerz它会的。在这个问题上,您有一个完整的示例:。如果你在那里问自己是否有问题,那就更好了,因为每个人都能看到。