获取互斥锁后调用等待操作

时间:2015-07-30 06:36:51

标签: c# windows-phone-8.1 mutex

如何在获取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关键字或完全删除文件写入方法,代码运行完全正常。因此,所有问题都是由调用异步方法引起的。我该怎么做才能解决这个问题?

1 个答案:

答案 0 :(得分:4)

这是监视器的工作(或使其更加异步友好,信号量),而不是互斥锁。

问题是WriteTextAsync的延续可能会在一个单独的线程上运行,因此它无法释放互斥锁 - 这只能从同一个线程完成最初获得了互斥锁。

var semaphore = new SemaphoreSlim(1);

await semaphore.WaitAsync();

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