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)
}
}