gpt4 book ai didi

.net - 等待多个输入时如何使用 TPL TransformBlock?

转载 作者:行者123 更新时间:2023-12-02 01:34:53 24 4
gpt4 key购买 nike

如果我有多个数据源(比如来自数据库),然后执行一些 CPU 密集型工作,我如何使用 TPL DataFlow 来表示它?

我注意到 TransformBlock 采用一个输入源,但输入来自多个源,我想充分利用并行性来实现这一点。

使用常规 TPL 或并行扩展对数据库执行 IO 绑定(bind)工作,然后将此数据合并到 TransformBlock 的一个点的最佳方法是什么?

最佳答案

看看JoinBlock ,这可能是你需要的。

您也可以创建 Custom Dataflow Block Type ,那可以做你想要达到的目标。

例如,如果您期望 5 个对象到达,在您“处理”它们之前,并返回单个对象(我在这里使用 expando 来说明...),到单个接收器(也应该异步等待):

public sealed class YourCustomBlock : IPropagatorBlock<ExpandoObject, ExpandoObject>
{

// The target part of the block. coming in
private readonly ITargetBlock<ExpandoObject> m_target;
// The source part of the block. going out
private readonly ISourceBlock<ExpandoObject> m_source;
// dependency count
private readonly int _size ;

// temporary holding area of incoming stuff
private Queue<ExpandoObject> _queue;

public YourCustomBlock(int inputs)
{
_size = inputs;
_queue = new Queue<ExpandoObject>(_size);

var mainWorker= new TransformBlock<ExpandoObject[], ExpandoObject> (async expandoArray =>
{
// Do Your Stuff with expandoArray and then return something
// ExpandoObject in this example

await Task.Delay(1000).ConfigureAwait(false);

return /*Some ExpandoObject */;
});

var head = new ActionBlock<ExpandoObject>(async item =>
{

_queue.Enqueue(item);

if (_queue.Count > _size)
{
_queue.Dequeue();
}
// Post when you reach
// the size
if (_queue.Count == _size)
{
await mainWorker.SendAsync(_queue.ToArray());
_queue.Clear();
}
});

// expose as a block
m_source = mainWorker;
m_target = head;

}
}

sample 用途:
var myBlock = new YourCustomBlock(5);
Task.Run(async () => {
for (var i=0;i<5;i++) {
await myBlock.SendAsync(/*SomeExpandoObject*/).ConfigureAwait(false);
}
});

var results = await myBlock.ReceiveAsync().ConfigureAwait(false);

注意:这还没有经过编译检查,只是这个想法的一个说明。

关于.net - 等待多个输入时如何使用 TPL TransformBlock?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31826575/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com