TPL .Continue在执行大量任务时具有优先级

时间:2014-06-11 14:51:08

标签: c# .net multithreading asynchronous task-parallel-library

我试图按特定顺序(FIFO)进行大量异步工作。

以下是代码:

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

我遇到的问题是在完成所有_broker.SendAsync之前不会发生Continuation。我希望它按顺序工作,即任何经纪人完成发送后立即运行ContinueWith。

这有意义吗?

2 个答案:

答案 0 :(得分:5)

一旦前人准备好就会触发

ContinueWith。在您的代码中,没有任何强制顺序执行。事实上,TPL怎么可能知道它是从foreach循环调用并延迟执行的呢?它无法知道。

可能你误解了你所看到的。也许broker2内部强制执行串行?没有进一步的信息就无法告诉。

考虑将循环体移动到辅助函数并在那里使用async/await。更易于使用。

答案 1 :(得分:1)

我一如既往地建议您使用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();