まさにそのBufferBlock
ためです。設定しBoundedCapacity
ていっぱいになると、誰かが消費するまでメッセージの受信が延期されます。これは、たとえばPost()
がブロックされSendAsync()
、 unfinished が返されることを意味しTask
ます。
編集:複数のターゲットに送信し、データを破棄しない組み込みブロックはありません。ただし、ループから簡単に作成ActionBlock
してループを送信できます。
static ITargetBlock<T> CreateMultipleTargetsBlock<T>(
IEnumerable<ITargetBlock<T>> targets, int boundedCapacity)
{
var targetsList = targets.ToList();
var block = new ActionBlock<T>(
async item =>
{
foreach (var target in targetsList)
{
await target.SendAsync(item);
}
},
new ExecutionDataflowBlockOptions { BoundedCapacity = boundedCapacity });
// TODO: propagate completion from block to targets
return block;
}
このコードは、ターゲットごとにデータを複製する必要がなく、ターゲットのリストが変更されないことを前提としています。そのためのコードの変更は非常に簡単です。