21

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

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”?

4

1 回答 1

27

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

    构建异步协调原语,第 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
    }
}
于 2012-04-12T17:10:11.543 回答