【发布时间】:2014-11-27 12:32:22
【问题描述】:
asyncTasks 的调度在 TPL 数据流中无法正常工作。在下面的示例中,我希望ActionBlock 在可用时立即处理来自TransformBlock 的数据。但它正在等待第二个(延迟的)结果,然后再进行第三个。我在这里误解了什么?对处理顺序有要求吗?
public class TestDataFlow
{
public System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
public async Task Flow()
{
watch.Start();
var plus10 = new TransformBlock<int, int>(async input =>
{
if (input == 2)
{
await Task.Delay(5000);
}
Console.WriteLine("Exiting plus10 for input {0} @ {1}", input, watch.Elapsed);
return input + 10;
},
new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = 4,
});
var printSolution = new ActionBlock<int>(input =>
{
Console.WriteLine("Solution: {0} @ {1}", input, watch.Elapsed.TotalMilliSeconds);
},
new ExecutionDataflowBlockOptions
{
MaxDegreeOfParallelism = 4,
});
plus10.LinkTo(printSolution);
List<int> inputs = new List<int> { 1, 2, 3 };
foreach (var input in inputs)
{
await plus10.SendAsync(input);
}
}
}
输出:
Exiting plus10 for input 1 @ 115.8583
Exiting plus10 for input 3 @ 116.6973
Solution: 11 @ 126.0146
Exiting plus10 for input 2 @ 5124.4074
Solution: 12 @ 5124.9014
Solution: 13 @ 5126.4834
【问题讨论】:
-
看看这个我的answer关于让网格忽略保持秩序
标签: c# .net task-parallel-library async-await tpl-dataflow