5

我有一个经常从多个线程调用的方法。它涉及使用await FileIO.WriteTextAsync. 从单个线程调用它时它工作正常,但是一旦我开始在多个线程中执行此操作,我会收到此错误:

The process cannot access the file because it is being used by another process.

我知道错误意味着什么,但我不确定如何解决它。通常,我会创建一个lock(object)语句,以确保一次只能由一个线程访问该文件。但是,这是一种异步方法,因此我不能在语句await的主体中使用运算符。lock(object)

请告知如何处理这种情况。

4

1 回答 1

6

您可以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()) 
  {
    ...
  }
}
于 2013-06-08T13:59:23.183 回答