Tôi đã đọc Dataflow (Task Parallel Library), và có một phần mà nói:Hiểu TPL Dataflow mức độ song song đặt hàng
Khi bạn chỉ định một mức độ tối đa song song đó là lớn hơn 1, nhiều tin nhắn được xử lý cùng một lúc, và do đó, các tin nhắn có thể không được xử lý theo thứ tự mà chúng được nhận. Tuy nhiên, thứ tự mà thông điệp được xuất ra từ khối sẽ được sắp xếp một cách chính xác.
Điều đó có nghĩa là gì?
Ví dụ, tôi đặt khối hành động của tôi với mức độ song song = 5:
testActionBlock = new ActionBlock<int>(i => Consumer(i),
new ExecutionDataflowBlockOptions()
{
MaxDegreeOfParallelism = 5
});
await Producer();
testActionBlock.Completion.Wait();
Nhà sản xuất của tôi() số cơ bản hàng đợi vào khối:
private async Task Producer()
{
for (int i=0; i<= 1000; i++)
{
await testActionBlock.SendAsync(i);
}
testActionBlock.Complete();
}
Và tiêu dùng của tôi (i) chỉ viết ra các dòng:
private async Task Consumer(int i)
{
if (i == 1)
{
await Task.Delay(5000);
}
Console.WriteLine(i);
}
Điều đó có nghĩa là người tiêu dùng (2) sẽ bị chặn cho đến khi người tiêu dùng (1) ha s hoàn thành chế biến (vì có một sự chậm trễ 5 giây)? Tôi đã thử nghiệm mã và nó không có vẻ như vậy. Ngay cả khi tôi đã gỡ bỏ độ trễ 5 giây, tôi không thấy đầu ra theo thứ tự.
[Cập nhật]
bBlock = new BufferBlock<int>(option);
testActionBlock = new ActionBlock<int>(i => Consumer(i),
new ExecutionDataflowBlockOptions()
{
MaxDegreeOfParallelism = 5
});
bBlock.LinkTo(testActionBlock);
await Producer();
testActionBlock.Completion.Wait();
My Nhà sản xuất() bây giờ sẽ thêm vào bBlock:
private async Task Producer()
{
for (int i=0; i<= 1000; i++)
{
await bBlock.SendAsync(i);
}
bBlock.Complete();
}
Vì vậy, trong trường hợp này, người tiêu dùng (1) sẽ chờ đợi trong vòng 5 giây, trước khi người tiêu dùng (2) có thể tiến hành?
cảm ơn bạn đã làm rõ. Nhưng tôi vẫn chưa rõ khi nào "thông báo đầu ra ... sẽ được sắp xếp lại". Tôi đã cập nhật câu hỏi ban đầu của mình để xem liệu hiểu của tôi có đúng không? – SimonSays
Luồng dữ liệu TPL cung cấp một cơ chế nhắn tin đầy đủ được thiết kế để nhận dữ liệu vào và ra khỏi các khối. Kiểm tra hướng dẫn tuyệt vời này từ MS với các ví dụ chính xác. https://msdn.microsoft.com/en-us/library/hh228597(v=vs.110).aspx – Tim