如何同步任务?

use*_*719 16 c# asynchronous task microsoft-metro windows-runtime

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

void SaveToFile()
{
   lock(something)
   {
      /// code here
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

dtb*_*dtb 25

对于异步互斥机制,请看一下

    构建异步协调基元,第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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么AsyncLock(和其他同步模式)不是TPL的组成部分? (2认同)