获取互斥锁后调用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关键字或完全删除文件写入方法,代码运行得非常好。所以,所有的麻烦都是由调用异步方法引起的。我能做些什么来解决这个问题?

获取互斥锁后调用await操作

这是一个监视器(或者为了更异步友好,一个信号量)的任务,而不是互斥锁。

问题是WriteTextAsync的延续可能在一个单独的线程上运行,所以它不能释放互斥锁——这只能从最初获得互斥锁的同一个线程中完成。

var semaphore = new SemaphoreSlim(1);
await semaphore.WaitAsync();
try
{
    await FileIO.WriteTextAsync(filename, text);
    Debug.WriteLine("written");
}
finally
{
    semaphore.Release();
}