在执行大量任务时使用优先级

本文关键字:优先级 任务 执行 | 更新日期: 2023-09-27 18:08:04

我正试图以一定的顺序(FIFO)做很多异步工作。

代码如下:

foreach (var header in headers)
   _broker.SendAsync(header.request)
          .ContinueWith(t => _broker2.SendAsync(t.Result.request2));

我遇到的问题是,没有Continuation发生,直到所有_broker。SendAsync完成。我希望它更顺序地工作,即在任何代理完成发送后立即运行ContinueWith。

这有意义吗?

在执行大量任务时使用优先级

ContinueWith在前置条件准备好后立即触发。在您的代码中没有强制顺序执行的内容。实际上,TPL怎么可能知道它是从foreach循环调用并延迟执行呢?它不能知道。

很可能,你误解了你所看到的。也许broker2内部强制串行执行?没有进一步的信息,很难说。

考虑将循环体移动到辅助函数中,并在那里使用async/await

一如既往,我建议您使用TPL Dataflow。它允许您声明一个清晰的顺序流,并让TPL处理后面的所有细节。您可以配置一定程度的并行性和有限容量,以使其更健壮。

var first = new TransformBlock<T, U>(header => _broker.SendAsync(header.request));
var second = new ActionBlock<U>(result => _broker2.SendAsync(result.request2));
first.LinkTo(second);
foreach (var header in headers)
    await first.SendAsync();