如何将多个异步方法设置到队列中?
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 所以此时代码等待任务完成。如果您提供更多详细信息,也许我们可以提供更好的解决方案。
我刚开始学习 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 所以此时代码等待任务完成。如果您提供更多详细信息,也许我们可以提供更好的解决方案。