По умолчанию поток данных сохраняет порядок сообщений, даже если они обрабатываются параллельно.
Чтобы преобразовать сообщения как можно быстрее, т. Е. Не в порядке, установите EnsureOrdered
в false
впараметры вашего TransformBlock
.
Обязательно используйте актуальную версию потока данных (в настоящее время пакет nuget System.Threading.Tasks.Dataflow
существует в версии 4.9), так как EnsureOrdered
не всегда был рядом.
Пример:
class Program
{
static void Main( string[] args )
{
var transformBlock = new TransformBlock<int, int>( x =>
{
Thread.Sleep( x );
return x;
}, new ExecutionDataflowBlockOptions {EnsureOrdered = false, MaxDegreeOfParallelism = 10} );
var actionBlock = new ActionBlock<int>( x => Console.WriteLine( x ) );
transformBlock.LinkTo( actionBlock, new DataflowLinkOptions {PropagateCompletion = true});
for( var i = 9; i > 0; i-- )
transformBlock.Post( i * 1000 );
transformBlock.Complete();
actionBlock.Completion.Wait();
Console.ReadLine();
}
}
Это выводит
1000
2000
3000
4000
5000
6000
7000
8000
9000