2014-03-24 31 views
1

我正在嘗試在Windows Phone 8應用程序中使用定期後臺任務。我想使用一個xml文件來序列化前臺應用程序和後臺任務之間的狀態信息。Windows Phone定期任務同步異步方法

我讀過你應該使用Mutex來同步對文件的訪問。但是,我遇到了使用它的問題,因爲我需要在使用Mutex(在讀取和寫入數據到文件中)的方法中調用await。這會導致我的應用程序在我調用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方法中已經調用Flush。哪裏是你的WP應用程序中使用的方便的文件http://codepaste.net/63vh4o –

+0

即使我不使用FushAsync,我仍然需要調用await GetFileStreamForWriting()來獲取文件流。 –

+0

你呢?查看我建議的文件 –

回答

1

一個Mutex只能由這樣你就不能使用await認爲它獲取了它在同一個線程被釋放。您可以使用Semaphore來實現相同的結果,因爲它們不受限於特定的線程。

semaphore.WaitOne(); 
await Task.Delay(2); // Your async call 
semaphore.Release();