当我尝试将函数添加到列表中时,BlockingCollection 会自动执行我的函数

本文关键字:函数 BlockingCollection 我的 执行 列表 添加 | 更新日期: 2023-09-27 18:32:46

            var tasks0 = new BlockingCollection<object>(new ConcurrentQueue<object>());
            tasks0.Add(Fetch(APCounter));
            tasks0.Add(Decode(APCounter));
            tasks0.Add(ALURes(APCounter));
            tasks0.Add(Memory(APCounter));
            tasks0.Add(WriteB(APCounter));

            var tasks1 = new BlockingCollection<object>(new ConcurrentQueue<object>());
            tasks1.Add(Fetch(APCounter+1));
            tasks1.Add(Decode(APCounter + 1));
            tasks1.Add(ALURes(APCounter + 1));
            tasks1.Add(Memory(APCounter + 1));
            tasks1.Add(WriteB(APCounter + 1));

我不希望它执行现在添加的功能。稍后我将使用业务逻辑手动执行此操作。!!!

当我尝试将函数添加到列表中时,BlockingCollection 会自动执行我的函数

正如其他人所说,您需要存储代表列表或类似的东西来做您想做的事情。 您正在执行这些函数,然后将结果存储在阻塞集合中。 您需要做的第一件事是将阻塞集合上的泛型类型更改为:

//add tasks
//if the functions return a common object other than "object" then adjust this accordingly
var tasks0 = new BlockingCollection<Func<object>>();//defaults to using a ConcurrentQueue
tasks0.Add(()=>Fetch(APCounter));
tasks0.Add(()=>Decode(APCounter));
tasks0.Add(()=>ALURes(APCounter));
tasks0.Add(()=>Memory(APCounter));
tasks0.Add()=>(WriteB(APCounter));

然后实际执行函数:

//run tasks
object firstResult = tasks0.Take()();
object secondResult = tasks0.Take()();
//...

如果我理解正确,您要将问题存储在函数队列列表中,稍后将调用。如果是这种情况,您需要的是:

tasks0.Add(() => Fetch(APCounter)); 
tasks0.Add(() => Decode(APCounter)); 

等等 - 因为

tasks0.Add(Fetch(APCounter)); 

将调用的结果添加到 Fetch(APCounter) ,而

tasks0.Add(() => Fetch(APCounter)); 

添加代理呼叫Fetch(APCounter)

如果您尝试这样做,则不会将方法添加到列表中。您正在调用 Fetch(APCounter) 之类的方法,然后将该方法的结果添加到BlockingCollection 中。

尝试创建委托并将委托添加到集合中。

public delegate FetchFunction(int apCounter);
tasks0.Add(FetchFunction(APCounter);
// or using lambda expressions
tasks0.Add(() => Fetch(APCounter));