Metro应用程序文件.WriteTextAsync多线程



我有一个经常从多个线程调用的方法。它涉及到使用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()) 
  {
    ...
  }
}

最新更新