2012-10-02 9 views
1

내가 파일에 기록하지만, "가끔"나는 시간의 일부, 나는이 메시지와 함께 System.UnauthorizedAccessException지고있어, 내가 동시성까지 생각하는 문제로 실행하려고 해요 :StorageFile 작업으로 동시성을 처리하는 방법은 무엇입니까?

을 접근이 금지되어있다. (HRESULT에서 예외 : 0x80070005입니다 (E_ACCESSDENIED))에서

... 다음

public async void SubmitChanges() 
{ 
    DataContractSerializer serializer = 
     new DataContractSerializer(typeof(LocalCache<T>)); 

    StorageFile file = await ApplicationData.Current.LocalFolder 
      .CreateFileAsync(GetFileNameForType(), 
       CreationCollisionOption.ReplaceExisting); 

    //Occasionally throws here 
    using (var fi = await file.OpenTransactedWriteAsync()) 
    { 
     serializer.WriteObject(fi.Stream.AsStreamForWrite(), this); 
     await fi.CommitAsync(); 
    } 
} 

나는 단지이 일부 동시성까지라고 가정 할 수있다, 또는 어딘가에 읽기가 아직 열려있는 그 외에는 사용할 수있게 될 때까지 기다릴 방법을 찾지 못하는 것 같습니다. 일반적으로 lock 주위에 있지만, 허용되지 않습니다. await 다른 옵션은 무엇입니까?

+0

동시성 문제가 발생하여 잠글 필요가있는 경우 SemaphoreSlim.WaitAsync()를 사용할 수 있습니다. http://msdn.microsoft.com/en-us/library/hh462788.aspx – Gavin

+0

@mydogisbox이 코드는 * * –

답변

6

일반적으로 이전 작업이 완료 될 때까지 다음 작업을 시작하지 마십시오.

팁 : 피하십시오 async void; 대신 async Task을 사용하십시오. 이를 통해 이전 작업이 완료된시기를 알 수 있습니다.

+0

나는 꽤 오랫동안 이것을 꼼짝 않고 바라보고 있었고 완전히 잊어 버렸습니다. - 어쩔 수없는 날이었습니다. 건배 : –

+0

FYI, 거기에 * AsyncLock [Stephen Toub에 의해 개발 됨] (http : // blogs.msdn.com/b/pfxteam/archive/2012/02/12/10266988.aspx) [AsyncEx] (http://nitoasyncex.codeplex.com/)에서 다운로드 할 수 있습니다. 나는이 시나리오에서 그것이 필요하다고 생각하지 않았다. –

1

여기에 여러 가지 일이있을 수 있습니다. 위에서 언급 한 Stephen처럼 캡슐화 메서드는 작업을 반환하지 않습니다. 즉, 어떤 메소드가 호출하든간에 SubmitChanges은 "화재 및 잊어"패턴으로 호출하며이 호출 다음의 코드는 병렬로 실행할 수 있습니다. 이것은 아마도 이 아니며입니다.

또한 StorageFile.OpenTransacted을 사용하고 있음을 확인했습니다. 이전에는 사용하지 않았지만 OpenTransacted는 ReplaceFile을 지원하는 운영 체제에서만 지원된다는 내용이 있습니다. 이 기능은 말 그대로 새로운 파일이 이전 파일의 신원을 추측하도록 허용하지만 이전 파일이 열려 있으면 조작이 실패 할 것이라고 확신합니다.

나는 당신이하고있는 라인 문을 사용하여 인해 에 자동으로 발생 폐기,에 일어날 거래 된 파일이 닫힐 때까지 일어날 파일 ID를 교환하려는 시도를 생각하지 않는다 때로는 예외가 발생합니다.

대신 작업을 반환하고 일반 StorageFile.OpenAsync을 사용하는 것이 좋습니다.

+0

나는 OpenTransacted를 사용하여 파일의 절반 구운 사본을 찾지 못하도록 읽습니다. 순간적으로 터치 IO 집중적 일 수 있으므로 아마도 내 객체 수명주기에 대해 생각할 필요가 있습니다. –

관련 문제