Я читал Dataflow (Task Parallel Library), и есть часть, которая говорит:Понимание TPL Dataflow Степень параллельности заказа
При указании максимальной степени параллелизма, который больше, чем 1, несколько сообщений обрабатываются одновременно, и поэтому сообщения могут не обрабатываться в том порядке, в котором они получены. Однако порядок, в котором сообщения выводятся из блока, будет правильно упорядочен.
Что это значит?
Пример, я могу установить блок действий со степенью параллельности = 5:
testActionBlock = new ActionBlock<int>(i => Consumer(i),
new ExecutionDataflowBlockOptions()
{
MaxDegreeOfParallelism = 5
});
await Producer();
testActionBlock.Completion.Wait();
Мой продюсер() в основном очереди чисел в блоке:
private async Task Producer()
{
for (int i=0; i<= 1000; i++)
{
await testActionBlock.SendAsync(i);
}
testActionBlock.Complete();
}
И мой Потребитель (я) просто выпишите строки:
private async Task Consumer(int i)
{
if (i == 1)
{
await Task.Delay(5000);
}
Console.WriteLine(i);
}
Означает ли это, что Потребитель (2) будет заблокирован до Потребителя (1) га (с задержкой 5 секунд)? Я тестировал код, и, похоже, это не так. Даже когда я удалял задержку 5 секунд, я не вижу, чтобы результат был в порядке.
[Update]
bBlock = new BufferBlock<int>(option);
testActionBlock = new ActionBlock<int>(i => Consumer(i),
new ExecutionDataflowBlockOptions()
{
MaxDegreeOfParallelism = 5
});
bBlock.LinkTo(testActionBlock);
await Producer();
testActionBlock.Completion.Wait();
Мой продюсер() теперь добавим к bBlock:
private async Task Producer()
{
for (int i=0; i<= 1000; i++)
{
await bBlock.SendAsync(i);
}
bBlock.Complete();
}
Таким образом, в этом случае Потребитель (1) будет ждать в течение 5 сек, прежде чем потребитель (2) может продолжить?
благодарит за разъяснения. Но я до сих пор неясно, когда говорится, что «выходы сообщений ... будут переупорядочены». Я обновил свой оригинальный вопрос, чтобы узнать, правильно ли я понял? – SimonSays
Поток данных TPL обеспечивает полный механизм обмена сообщениями, предназначенный для получения данных в блоках и из них. Ознакомьтесь с этим отличным руководством от MS с точными примерами. https://msdn.microsoft.com/en-us/library/hh228597(v=vs.110).aspx – Tim