C# 第三方物流。在执行大量任务时继续优先

C# 第三方物流。在执行大量任务时继续优先,c#,.net,multithreading,asynchronous,task-parallel-library,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完成之前,不会发生任何继续。我希望它能更有序地工作,也就是在任何代理完成发送后继续运行 这有什

我正在尝试按照一定的顺序(FIFO)进行大量异步工作

代码如下:

foreach (var header in headers)
   _broker.SendAsync(header.request)
          .ContinueWith(t => _broker2.SendAsync(t.Result.request2));
我遇到的问题是,在所有_broker.SendAsync完成之前,不会发生任何继续。我希望它能更有序地工作,也就是在任何代理完成发送后继续运行


这有什么意义吗?

ContinueWith
会在先行项准备就绪后立即触发。在您的代码中没有强制顺序执行的内容。事实上,TPL怎么可能知道它正在从
foreach
循环调用并延迟执行?它不可能知道

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


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

一旦先行项准备就绪,就会触发ContinueWith
。在您的代码中没有强制顺序执行的内容。事实上,TPL怎么可能知道它正在从
foreach
循环调用并延迟执行?它不可能知道

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


考虑将循环体移动到helper函数中,并在那里使用
async/await
。易于使用。

我建议您一如既往地使用。它可以让您声明一个清晰的顺序流,并让
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();
var first=newtransformblock(header=>_broker.SendAsync(header.request));
var second=newactionblock(result=>_broker2.SendAsync(result.request2));
第一,链接到(第二);
foreach(标头中的var标头)
首先等待。SendAsync();

我建议您一如既往地使用。它可以让您声明一个清晰的顺序流,并让
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();
var first=newtransformblock(header=>_broker.SendAsync(header.request));
var second=newactionblock(result=>_broker2.SendAsync(result.request2));
第一,链接到(第二);
foreach(标头中的var标头)
首先等待。SendAsync();

您所说的“所有_broker.SendAsync都已完成”是什么意思?什么类型是
\u broker
?类型
\u broker
是否支持对
的多个调用。SendAsync
?\u broker是一个自定义实现。它是线程安全的,并且支持多个调用。您所说的“所有_broker.SendAsync都已完成”是什么意思?什么类型是
\u broker
?类型
\u broker
是否支持对
的多个调用。SendAsync
?\u broker是一个自定义实现。它是线程安全的,并且支持多个调用。