2014-03-24 33 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();