Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何同步任务?_C#_Asynchronous_Task_Microsoft Metro_Windows Runtime - Fatal编程技术网

C# 如何同步任务?

C# 如何同步任务?,c#,asynchronous,task,microsoft-metro,windows-runtime,C#,Asynchronous,Task,Microsoft Metro,Windows Runtime,假设我有一个保存到文件的异步方法: async Task SaveToFileAsync() { var file = await folder.GetFileAsync ( ...) var stream = file.OpenFileAsync(...) ///etc } 现在假设SaveToFileAsync同时被调用两次。这是一个问题,因为不能同时在同一个文件上写入 如果这是一个常规方法,lock()将修复此问题: void SaveToFile() { lo

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

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”一次只调用一次?

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

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

不是“SaveToFileAsync”一次只调用一次,表明您希望使用与设计目的完全相反的方法?@Jeff唯一想到的是,您希望异步保存到两个不同的文件,但希望同步对同一文件的访问…您可以使用一个单独的工作进程操作的队列打开。禁用
保存
按钮作为任务的第一步,并将其作为最后一步重新启用。为什么异步锁(和其他同步模式)不是TPL的组成部分?
第6部分
post不提供复制/粘贴代码。另一位博主在这里汇总了以下内容: