Windows Phone定期任务同步异步方法

时间:2014-03-24 21:14:37

标签: c# asynchronous windows-phone-8

我试图在Windows Phone 8应用程序上使用Periodic Background Task。我想使用xml文件来序列化前台应用程序和后台任务之间的状态信息。

我读过您应该使用Mutex来同步对文件的访问。但是,我遇到了使用它的问题,因为我需要在我使用Mutex的方法中调用await(读取和写入文件的数据)。这会导致我的应用程序在我调用Mutex时锁定。因为它是在不同的线程上发布的。任何想法如何处理这个?

    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();
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

Mutex只能由获取它的同一个线程释放,因此您无法将其与await一起使用。您可以使用Semaphore来获得相同的结果,因为它们不受特定线程的约束。

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