5

複数のスレッドから頻繁に呼び出されるメソッドがあります。を使用してディスクに書き込む必要がありawait FileIO.WriteTextAsyncます。これは、単一のスレッドから呼び出された場合は正常に機能しますが、複数のスレッドでこれを開始すると、次のエラーが発生します。

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

エラーの意味はわかりますが、回避方法がわかりません。通常、一度にlock(object)1 つのスレッドのみがファイルにアクセスするようにステートメントを作成します。ただし、これは非同期メソッドであるため、ステートメント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 に答える