如何将多个异步方法设置到队列中?

How to setup multiple async methods into a queue?

我刚开始学习 async/await,我编写了一系列异步方法,每个方法执行一个数据库 SQL 任务,并将每个方法绑定到不同的按钮。单击按钮时 GUI 不会锁定,所以我认为这很棒。

但是,如果您单击每个按钮,所需的结果将是第二个按钮将等待第一个任务完成,依此类推。但是,使用 async/await 如果我单击多个按钮,我不能保证哪个会先完成。因此它可以创建一些不需要的竞争条件,导致 SQL 查询失败。

是否有 class/object/keyword 或我可以使用的东西,而不是让每个异步方法处理一个单独的 SQL 命令,而是将其添加到队列中,并且以某种方式仅串行处理队列什么时候添加了东西?

对此有很多可能的设计。但我总是更喜欢 TPL Dataflow。

您可以使用 ActionBlock 和 post async 委托进行顺序处理:

ActionBlock<Func<Task>> _block = new ActionBlock<Func<Task>>(action => action());

block.Post(async () => 
{
    await Task.Delay(1000);
    MessageBox.Show("bar");
});

另一种可能的解决方案是在执行 async 操作之前异步等待 SemphoreSlim 设置为 1,以确保一次只能执行一个操作:

SemaphoreSlim _semaphore = new SemaphoreSlim(1);

_semaphore.WaitAsync()
try
{
    await Task.Delay(1000);
    MessageBox.Show("bar");
}
finally
{
    _semaphore.Release();
}

我不确定我是否理解这个问题,但是如果你想在你做其他事情之前等待特定任务完成,你可以做的是把你开始的任务放在局部变量或列表中,蚂蚁使用 Wait on your任务或 Task.WaitAll 所以此时代码等待任务完成。如果您提供更多详细信息,也许我们可以提供更好的解决方案。