当某些并行进程执行繁重的工作时,数据流会阻塞
Posted
技术标签:
【中文标题】当某些并行进程执行繁重的工作时,数据流会阻塞【英文标题】:Dataflow blocks when some parallel process does a heavy job 【发布时间】:2019-08-25 22:27:43 【问题描述】:我正在尝试了解 TPL 数据流。 我有两个块 inputBlock och nextBlock。
使用 MaxDegreeOfParallelism = 2 的输入块。 我有这种情况,它可能需要不同的时间来完成并行作业。我不希望数据流停止,因为某些并行工作需要很长时间才能完成。 我只是希望每个并行作业从队列中取出一个项目并对其进行处理,然后将其传递给下一个块。
当第一个块“inputBlock”中的一个并行作业进入睡眠状态或执行繁重的工作时,我永远不会到达 nextBlock。
internal class Program
private static bool _sleep = true;
private static void Main(string[] args)
var inputBlock = new TransformBlock<string, string>(
x =>
if (_sleep)
_sleep = false;
Console.WriteLine("First thread sleeping");
Thread.Sleep(5000000);
Console.WriteLine("Second thread running");
return x;
,
new ExecutionDataflowBlockOptions MaxDegreeOfParallelism = 2); //1
var nextBlock = new TransformBlock<string, string>(
x =>
Console.WriteLine(x);
return x;
); //2
inputBlock.LinkTo(nextBlock, new DataflowLinkOptions PropagateCompletion = true);
for (var i = 0; i < 100; i++)
input.Post(i.ToString());
input.Complete();
Console.ReadLine();
【问题讨论】:
【参考方案1】:使用 EnsureOrdered = false 就是答案。
新的 ExecutionDataflowBlockOptions MaxDegreeOfParallelism = 2, EnsureOrdered = false);
【讨论】:
以上是关于当某些并行进程执行繁重的工作时,数据流会阻塞的主要内容,如果未能解决你的问题,请参考以下文章