gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:07 25 4
gpt4 key购买 nike

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

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

是否有一个类/对象/关键字或我可以使用的东西,而不是让每个异步方法处理一个单独的 SQL 命令,而是将它添加到一个队列中,并且仅当某些东西被添加到队列中时,队列才会被串行处理是吗?

最佳答案

为此有许多可能的设计。但我始终更喜欢 TPL Dataflow。

您可以使用 ActionBlock 并将 async 委托(delegate)发布到其中以进行顺序处理:

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

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

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

SemaphoreSlim _semaphore = new SemaphoreSlim(1);

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

关于c# - 如何将多个异步方法设置到队列中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30561266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com