如何同步任务

本文关键字:任务 同步 何同步 | 更新日期: 2023-09-27 18:30:49

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

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

如何同步任务

有关异步互斥机制,请查看

    构建异步协调基元,第 6 部分:异步锁

您可以使用以下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
    }
}