获取互斥锁后调用await操作
本文关键字:调用 await 操作 获取 | 更新日期: 2023-09-27 18:05:24
如何在获得mutex
后使用await FileIO.WriteTextAsync()
(在Windows Phone 8.1中)写入文件,以便没有两个线程访问相同的文件并确保互斥。我正在做以下事情:
mutex.WaitOne()
try
{
await FileIO.WriteTextAsync(filename, text);
Debug.WriteLine("written");
}
finally
{
mutex.ReleaseMutex();
}
但是该方法只适用于一个或两个迭代,之后它抛出一个System.Exception
。此外,如果我删除await
关键字或完全删除文件写入方法,代码运行得非常好。所以,所有的麻烦都是由调用异步方法引起的。我能做些什么来解决这个问题?
这是一个监视器(或者为了更异步友好,一个信号量)的任务,而不是互斥锁。
问题是WriteTextAsync
的延续可能在一个单独的线程上运行,所以它不能释放互斥锁——这只能从最初获得互斥锁的同一个线程中完成。
var semaphore = new SemaphoreSlim(1);
await semaphore.WaitAsync();
try
{
await FileIO.WriteTextAsync(filename, text);
Debug.WriteLine("written");
}
finally
{
semaphore.Release();
}