在获取互斥锁之后调用await操作

5

如何使用await FileIO.WriteTextAsync()(在Windows Phone 8.1中)写入文件后获取mutex,以便确保任何两个线程访问同一文件并且实现互斥。我正在执行以下操作:

mutex.WaitOne()

try
{
    await FileIO.WriteTextAsync(filename, text);
    Debug.WriteLine("written");
}
finally
{
    mutex.ReleaseMutex();
}

但该方法仅适用于一两次迭代,之后会抛出System.Exception异常。同时,如果我移除await关键字或完全移除文件写入方法,则代码将能够完美运行。因此,所有问题都是由于调用异步方法造成的。我应该如何解决这个问题呢?


1
如果您需要在同一进程中保护资源,那么Luaan的答案应该能够胜任。如果您需要在进程之间保护资源(我认为这是互斥锁的主要作用),那么请查看此问题 - Romasz
1个回答

11

这需要一个监视器(或为了更加异步友好,一个信号量),而不是互斥锁。

问题在于继续执行WriteTextAsync很可能会在单独的线程上运行,因此它无法释放互斥锁——只有从最初获取互斥锁的同一线程才能释放它。

var semaphore = new SemaphoreSlim(1);

await semaphore.WaitAsync();

try
{
    await FileIO.WriteTextAsync(filename, text);
    Debug.WriteLine("written");
}
finally
{
    semaphore.Release();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接