我有一个经常从多个线程调用的方法。它涉及到使用await FileIO.WriteTextAsync
写入磁盘。当从单个线程调用它时,这可以正常工作,但是一旦我开始在多个线程中执行此操作,我得到这个错误:
The process cannot access the file because it is being used by another process.
我知道错误意味着什么,但我不确定如何解决它。通常,我会创建一个lock(object)
语句,以确保一次只有一个线程访问文件。然而,这是一个异步方法,因此我不能在lock(object)
语句的主体中使用await
操作符。
请告知如何处理这种情况
您可以使用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())
{
...
}
}