2013-06-08 2 views
5

나는 여러 스레드에서 자주 호출되는 메서드가 있습니다. await FileIO.WriteTextAsync을 사용하여 디스크에 쓰는 작업이 포함됩니다. 이 단일 스레드에서 호출 할 때 잘 작동하지만 내가 여러 스레드에서이 일을 시작하면,이 오류가 얻을 : 나는 오류가 무엇을 의미하는지 알고,하지만 난이 작동하는 방법을 잘 모르겠어요메트로 응용 FileIO.WriteTextAsync 여러 스레드

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

을 그것 주위. 일반적으로 한 번에 하나의 스레드에서만 파일에 액세스 할 수 있도록 lock(object) 문을 만듭니다. 그러나 이것은 비동기 메서드이므로 lock(object) 문 본문에 await 연산자를 사용할 수 없습니다.

이 시나리오를 처리하는 방법에 대해 조언 해주십시오.

답변

6

당신은 async 호환 잠금 역할을 SemaphoreSlim를 사용할 수 있습니다 개인적으로

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()) 
    { 
    ... 
    } 
} 
+0

그럼 왜 그렇게 큰 평판을 얻었는지 궁금하지 않습니다. 솔루션과 그것에 대한 개인적인 감동은 환상적이었습니다. 내 과정이 완벽하게 지금 실행 중입니다. 또한 비슷한 문제로 고통 받고있는 로깅 수업을 강화하기 위해 귀하의 제안을 사용했습니다. 고마워! – c0D3l0g1c

+0

여러분을 환영합니다! –