C# 如何在队列中设置多个异步方法?

C# 如何在队列中设置多个异步方法?,c#,.net,queue,async-await,.net-4.5,C#,.net,Queue,Async Await,.net 4.5,我刚刚学习了async/await,编写了一系列异步方法,每个方法执行一个数据库SQL任务,并将每个方法绑定到不同的按钮。当你点击一个按钮时,GUI不会被锁定,所以我觉得这太棒了 但是,如果单击每个按钮,则所需的结果将是第二个按钮将等待第一个任务完成,依此类推。但是,使用async/await,如果单击多个按钮,则无法保证哪个按钮将首先完成。因此,它可能会创建一些不必要的竞争条件,从而导致SQL查询失败 是否有一个类/对象/关键字或其他东西可以用来代替每个异步方法处理一个单独的SQL命令,而是将

我刚刚学习了async/await,编写了一系列异步方法,每个方法执行一个数据库SQL任务,并将每个方法绑定到不同的按钮。当你点击一个按钮时,GUI不会被锁定,所以我觉得这太棒了

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


是否有一个类/对象/关键字或其他东西可以用来代替每个异步方法处理一个单独的SQL命令,而是将其添加到队列中,并且只有在向队列中添加了某些内容时才以串行方式处理该队列?

这方面有许多可能的设计。但我总是更喜欢第三方物流数据流

您可以使用
ActionBlock
并将
async
委托发布到其中,以便按顺序处理:

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

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

我不确定我是否理解这个问题,但是如果你想在做其他事情之前等待特定任务完成,你可以做的是将你开始的任务放在局部变量或列表中,然后在你的任务或任务上使用wait.WaitAll,所以在这一点上,代码会等待任务竞争。如果你提供更多的细节,也许我们可以提供更好的解决方案

很好的例子,谢谢。我觉得有一件事很简单,但如果你不知道它的名字,就很难搜索。有没有办法查看在任何给定点队列中有多少任务?@user17753 block。输入队列
SemaphoreSlim _semaphore = new SemaphoreSlim(1);

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