2014-12-07 41 views
0

我有一个小任务 - 我必须创建互斥体,使用任务和异步\ await,不阻止当前线程(UI线程)。互斥体,不阻止当前(UI)线程

互斥接口:

锁() - 返回一个任务,至极将完成,只有当互斥体将成为自由。每个Release()调用不得超过1次解锁,此任务必须为每个锁的唯一密钥 。 释放() - 释放互斥锁。由Lock()返回的任务中的一个且只有一个必须完成。 该互斥体必须以这样的方式

await mutex.Lock(); 
// critical code 
mutex.Release(); 

我写了一些代码段的工作(见到底链接),但如果简单地说明问题: 我创建一个类的互斥。 在该方法中锁定我做这样的事情:

await Task.Factory.StartNew(() => 
{ 
    mutex.WaitOne(); 
    UserDispatcher = Dispatcher.CurrentDispatcher; 
}); 

在该方法中释放我做这样的事情:

if (mutex != null && UserDispatcher != null) 
{ 
    UserDispatcher.Invoke(new Action(() => 
    { 
     Console.WriteLine("Releasing"); 
     mutex.ReleaseMutex(); 
    })); 
} 

当我真的试图释放互斥体,我的程序只是冻结,直到永远。什么问题?

全码:https://www.dropbox.com/s/4a370cn1bd2o0nz/MainWindow.xaml.cs?dl=0

链接到项目:https://www.dropbox.com/sh/qsgle79jdgpr7cd/AAA3MZ6VlTNbUj-isgaQaLE-a?dl=0

回答

0

你可能对你的手死锁时,UI线程被卡住正在等待互斥体上mutex.WaitOne();被释放,你想通过使用调度程序在其上发布mutex.ReleaseMutex();,使用相同的UI线程(被阻止)释放它。

如果你想要一个async互斥体,你可以简单地使用SemaphoreSlim设置为1(因此,互斥),并调用WaitAsync异步等待。

Here是我使用SemaphoreSlim执行AsyncLock(与异步互斥锁相同)。

+0

这里有一个小问题...我的互斥锁必须以这种方式工作'await mutex.Lock();',我不能用信号量做到这一点( – progerz 2014-12-08 16:36:05

+0

@progerz你可以用'SemaphoreSlim'和WaitAsync '。 – i3arnon 2014-12-08 16:37:29

+0

@ i3aron,它会以这种方式工作吗?你有Skype或其他使者吗?我几乎没有关于这个问题的任何疑问。 – progerz 2014-12-08 16:49:11