2014-03-24 5 views
1

Windows Phone 8 응용 프로그램에서 주기적 백그라운드 작업을 사용하려고합니다. 포 그라운드 응용 프로그램과 백그라운드 작업간에 상태 정보를 직렬화하기 위해 XML 파일을 사용하고 싶습니다.Windows Phone 정기 작업 동기화 비동기 메서드

뮤텍스를 사용하여 파일에 대한 액세스를 동기화해야한다는 내용을 읽었습니다. 그러나 뮤텍스를 (파일에 데이터를 읽고 쓰는 데) 사용하는 메서드에서 기다려야하므로이 메서드를 사용하여 문제가 발생합니다. 이로 인해 Mutex.Release를 호출 할 때 다른 앱에서 해제되어 앱이 잠길 수 있습니다. 어떤 아이디어가 이것을 처리하는 방법?

public async Task WriteState(BackgroundTaskState state) 
    {    
     using (var m = new Mutex(false, BackgroundTaskState.MutexName)) 
     { 

      try 
      { 
       m.WaitOne(); 

       using (var stream = await GetFileStreamForWriting()) 
       { 
        XmlSerializer xmlSerializer = new XmlSerializer(typeof(BackgroundTaskState)); 
        xmlSerializer.Serialize(stream, state); 
        await stream.FlushAsync(); 
       } 
      } 
      catch (Exception) 
      { 

      } 
      finally 
      { 
       m.ReleaseMutex(); 
      } 
     } 
    } 
+0

사용할 때 래핑 할 때 FlushAsync를 호출 할 필요가 없습니다. 플러시는 이미 Dispose 메서드 내에서 호출됩니다. WP 애플 리케이션에서 사용할 수있는 편리한 파일은 어디입니까 http://codepaste.net/63vh4o –

+0

FushAsync를 사용하지 않더라도 GetFileStreamForWriting()을 호출하여 파일 스트림을 가져올 필요가 있습니다. –

+0

당신 은요? 내가 제안한 파일을 확인해보십시오. –

답변

1

Mutex 만이 await 함께 사용 할 수 있도록 인수 동일한 스레드에 의해 발표해야합니다. Semaphore을 사용하면 특정 스레드에 바인드되지 않으므로 동일한 결과를 얻을 수 있습니다.

semaphore.WaitOne(); 
await Task.Delay(2); // Your async call 
semaphore.Release(); 
관련 문제