如何在获取await FileIO.WriteTextAsync()
后使用mutex
(在Windows Phone 8.1中)写入文件,以便没有两个线程访问同一文件并确保互斥。我正在做以下事情:
mutex.WaitOne()
try
{
await FileIO.WriteTextAsync(filename, text);
Debug.WriteLine("written");
}
finally
{
mutex.ReleaseMutex();
}
但该方法仅适用于一次或两次迭代,之后会抛出System.Exception
。此外,如果我删除await
关键字或完全删除文件写入方法,代码运行完全正常。因此,所有问题都是由调用异步方法引起的。我该怎么做才能解决这个问题?
答案 0 :(得分:4)
这是监视器的工作(或使其更加异步友好,信号量),而不是互斥锁。
问题是WriteTextAsync
的延续可能会在一个单独的线程上运行,因此它无法释放互斥锁 - 这只能从同一个线程完成最初获得了互斥锁。
var semaphore = new SemaphoreSlim(1);
await semaphore.WaitAsync();
try
{
await FileIO.WriteTextAsync(filename, text);
Debug.WriteLine("written");
}
finally
{
semaphore.Release();
}