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