示例程序具有以下 BatchBlock: new BatchBlock<int>(10, new GroupingDataflowBlockOptions { MaxNumberOfGroups = 2 });,其中有 60 个 int 数据项正在发送并在一个单独的任务上使用。
问题是 ,await sourceBlock.SendAsync(i);似乎并没有在等待,即使达到 BatchBlock 有界容量,数据仍在不断发送,而没有消耗任务首先取出任何项目。最终 BatchBlock 只接收 2 批 10 个 int 数据项。我希望await sourceBlock.SendAsync(i);在发送 20 个项目时暂停执行,因为块的有界容量设置为 10,最多 2 个组。然后在某个时候,消费任务将接收数据并且该过程将重复。
我附上了下面的代码,创建一个简单的控制台应用程序,将以下内容添加到主程序中:
BatchBlockIssueReplication().GetAwaiter().GetResult();
调用方法:
public static async Task BatchBlockIssueReplication()
{
var sourceBlock = new BatchBlock<int>(10, new GroupingDataflowBlockOptions { MaxNumberOfGroups = 2 });
// Reading data from the source block
Task fireAndForget = Task.Run(async () =>
{
while (!sourceBlock.Completion.IsCanceled)
{
await Task.Delay(1500);
if (await sourceBlock.OutputAvailableAsync() && sourceBlock.TryReceiveAll(out var results))
{
Console.WriteLine("Received: ");
foreach (var result in results)
{
Console.Write($"{result.Length} ");
}
Console.WriteLine();
}
}
});
for (int i = 0; i < 60; i++)
{
Console.WriteLine($"Sending {i} to the source block");
await sourceBlock.SendAsync(i);
}
Console.WriteLine("Finished sending data to the source block");
await Task.Delay(10000);
}
慕运维8079593
拉莫斯之舞
相关分类