C# 生产者消费者集合,能够读取和写入批量数据

C# 生产者消费者集合,能够读取和写入批量数据,c#,multithreading,task-parallel-library,producer-consumer,C#,Multithreading,Task Parallel Library,Producer Consumer,我在找一个像这样的收藏 但使用的方法如下: SendAsync<T>(T[]) T[] ReceiveAsync<T>() sendaync(T[] T[]ReceiveAsync() 是否有人可以帮助?并且可以作为扩展方法在ISourceBlock和ITargetBlockT接口上使用。这意味着您必须将块强制转换到这些接口,以便使用扩展方法,例如: var buffer=new BufferBlock<string>(); var source=(IS

我在找一个像这样的收藏

但使用的方法如下:

SendAsync<T>(T[])
T[] ReceiveAsync<T>()
sendaync(T[]
T[]ReceiveAsync()
是否有人可以帮助?

并且可以作为扩展方法在ISourceBlock和ITargetBlockT接口上使用。这意味着您必须将块强制转换到这些接口,以便使用扩展方法,例如:

var buffer=new BufferBlock<string>();

var source=(ISourceBlock<string>)buffer;
var target=(ITargetBlock<string>)buffer;

await target.SendAsync("something");
var buffer=new BufferBlock();
变量源=(ISourceBlock)缓冲区;
var目标=(ITargetBlock)缓冲区;
等待target.SendAsync(“某物”);
通常这不是问题,因为所有数据流方法都接受接口,而不是具体类型,例如:

async Task MyProducer(ITargetBlock<string> target)
{
    ...
    await target.SendAsync(..);
    ...
    target.Complete();
}

async Task MyConsumer(ISourceBlock<string> target)
{
    ...
    var message=await target.ReceiveAsync();
    ...
}

public static async Task Main()
{
    var buffer=new BufferBlock<string>();
    MyProducer(buffer);
    await MyConsumer(buffer);
}
异步任务MyProducer(ITargetBlock目标) { ... 等待target.SendAsync(..); ... target.Complete(); } 异步任务MyConsumer(ISourceBlock目标) { ... var message=await target.ReceiveAsync(); ... } 公共静态异步任务Main() { var buffer=new BufferBlock(); 我的生产者(缓冲区); 等待支原体(缓冲液); }
这些方法不可用,
SendAsync
只接受一个
t
receiveasync
只返回一个
t
,而不返回数组

SendAsync<T>(T[])
T[] ReceiveAsync<T>()
请注意,
sendascync
确实会返回一个bool,表示接受消息。您可以返回一个boolean数组,或者如果其中任何一个返回false,则返回boolean,但这取决于您自己


可能使用
BatchBlock
会更容易,您可以使用循环将项目作为单个发送到,但会成批发送项目,如果您正在构建管道,这比使用
TryRecieveAll
更容易。你检查过扩展方法了吗?@Hackerman,是的。。。重复检查;)如果我遗漏了什么,你能告诉我吗?为什么不使用BufferBlock?顺便说一句,它确实有这样的方法。检查除Bufferblock外是否有其他明确支持发布/订阅的功能,您可以尝试新的System.Threading.Tasks.Channels包添加另一个选项,
BatchBlock
可能更适合您,但这取决于您的使用情况。感谢您的关注和努力。但是我的问题是关于阅读和编写成批的元素。我知道单元素发送/接收这个方法,在我的问题中的“按链接”一文中有描述。@gabba那么你应该使用BatchBlock,而不是BufferBlockThank。将使用BatchBlock和BufferBlock作为JSteward建议的BatchBlock的hanks,这与我所寻找的非常接近。理想情况下,if集合可以异步处理批输入,并且可以异步读取只有最大大小的批,而无需外部计时器
public static async Task SendAllAsync<T>(this ITargetBlock<T> block, IEnumerable<T> items)
{
    foreach(var item in items)
    {
         await block.SendAsync(item)
    }
}