如何同步任务?

时间:2012-04-12 17:05:05

标签: c# asynchronous task microsoft-metro windows-runtime

假设我有一个保存到文件的异步方法:

async Task SaveToFileAsync()
{
   var file = await folder.GetFileAsync ( ...)
   var stream = file.OpenFileAsync(...)
   ///etc

}

现在想象SaveToFileAsync同时被调用两次。这是一个问题,因为您无法同时在同一个文件上写入

如果这是常规方法,lock()会解决这个问题:

void SaveToFile()
{
   lock(something)
   {
      /// code here
   }
}

但是,异步方法中不允许锁定。

当然,可以调用Monitor.Enter()或使用互斥锁,但这些对象可以使用线程,而不是任务。因此他们不是答案。

因为lock()不是一个选项,如何同步多个任务? 特别是,我应该编写什么代码以确保一次只调用一次“SaveToFileAsync”?

1 个答案:

答案 0 :(得分:25)

对于异步互斥机制,请查看

Building Async Coordination Primitives, Part 6: AsyncLock

您可以使用AsyncLock类:

private readonly AsyncLock m_lock = new AsyncLock();

async Task SaveToFileAsync()
{
    using (await m_lock.LockAsync()) 
    { 
        var file = await folder.GetFileAsync(...);
        var stream = await file.OpenFileAsync(...);
        // etc
    }
}