如何将同步任务? [英] How to a synchronize tasks?

查看:127
本文介绍了如何将同步任务?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

说我有它保存到文件异步方法:

Say I have an async method which saves to file:

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

}

现在想象SaveToFileAsync同时调用两次。这是一个问题,因为你不能在同一个文件同时写入

Now imagine that SaveToFileAsync is called twice simultaneously. This is a problem because you can't write on the same file simultaneously

如果这是一个普通的方法,锁定()将解决这个问题:

If this were a regular method, lock() would fix this:

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

然而,锁不被在异步方法允许

However, lock is not allowed in an async method.

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

Of course, one could call Monitor.Enter() or use a mutex but these objects work with threads, not tasks. Therefore they are not the answer.

所以,因为锁()是不是一种选择,怎么能同步多个任务?
特别是,我应该写什么code,确保SaveToFileAsync是在同一时间只能调用一次?

So since lock() is not an option, how can synchronize multiple tasks? In particular, what code should I write to ensure that "SaveToFileAsync" is called only once at a time?

推荐答案

有关异步互斥机制,看看

For an async mutual exclusion mechanism, have a look at

    大厦异步协调原语,第6部分:AsyncLock

    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
    }
}

这篇关于如何将同步任务?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆