我有一个从多个线程频繁调用的方法。它涉及使用 await FileIO.WriteTextAsync
写入磁盘.这在从单个线程调用时工作正常,但是一旦我开始在多个线程中执行此操作,就会收到此错误:
The process cannot access the file because it is being used by another process.
我知道错误意味着什么,但我不确定如何解决它。通常,我会创建一个
lock(object)
语句,以确保一次只有一个线程访问该文件。但是,这是一种异步方法,因此我不能使用 await
lock(object)
主体中的运算符陈述。请告知如何处理这种情况。
最佳答案
您可以使用 SemaphoreSlim
充当 async
-兼容锁:
SemaphoreSlim _mutex = new SemaphoreSlim(1);
async Task MyMethodAsync()
{
await _mutex.WaitAsync();
try
{
...
}
finally
{
_mutex.Release();
}
}
就个人而言,我不喜欢
finally
,所以我通常自己写IDisposable
在处置时释放互斥锁,我的代码如下所示:async Task MyMethodAsync()
{
// LockAsync is an extension method returning my custom IDisposable
using (await _mutex.LockAsync())
{
...
}
}
关于windows-runtime - Metro App FileIO.WriteTextAsync 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17000227/