我试图了解TPL数据流。 我有两个块inputBlock和nextBlock。
使用MaxDegreeOfParallelism = 2的inputBlock。 我有这种情况,完成并行作业可能需要花费不同的时间。我不希望由于某些并行作业需要很长时间才能完成而停止数据流。 我只是希望每个并行作业从队列中取出一项并处理它,然后将其传递到下一个块。
当第一个块“ 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();
}
}
}
答案 0 :(得分:1)
使用sureOrdered = false是答案。
新的ExecutionDataflowBlockOptions {MaxDegreeOfParallelism = 2,sureOrdered = false});