获取mutex后调用await操作

Calling await operation after acquiring mutex

如何在获取 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();
}