我有一个小任务 - 我必须创建互斥体,使用任务和异步\ 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
这里有一个小问题...我的互斥锁必须以这种方式工作'await mutex.Lock();',我不能用信号量做到这一点( – progerz 2014-12-08 16:36:05
@progerz你可以用'SemaphoreSlim'和WaitAsync '。 – i3arnon 2014-12-08 16:37:29
@ i3aron,它会以这种方式工作吗?你有Skype或其他使者吗?我几乎没有关于这个问题的任何疑问。 – progerz 2014-12-08 16:49:11