【发布时间】:2021-05-20 07:18:27
【问题描述】:
我有一个场景,我需要并行运行 3 个 async 方法,我这样做如下:
using (Method1 m1 = new Method1())
using (Method2 m2 = new Method2())
using (Method3 m3 = new Method3())
{
var T_1 = m1.FETCH(); // 10 Seconds
var T_2 = m2.FETCH(); // 2 Seconds
var T_3 = m3.FETCH(); // 30 Seconds
}
// ALL 3 STARTED
await Task.WhenAll(T_1, T_2, T_3);
var result_1 = await T_1;
var result_2 = await T_2;
var result_3 = await T_3;
// AL 3 FINISHED - Total time 42 seconds
这很好,一旦所有 3 个都完成,我可以加载下一个 3
using (Method4 m4 = new Method4())
using (Method5 m5 = new Method5())
using (Method6 m6 = new Method6())
{
var T_4 = m1.FETCH(); // 10 Seconds
var T_5 = m2.FETCH(); // 2 Seconds
var T_6 = m6.FETCH(); // 30 Seconds
}
// ALL 3 STARTED
await Task.WhenAll(T_4, T_5, T_6);
var result_4 = await T_4;
var result_5 = await T_52;
var result_6 = await T_6;
// AL 3 FINISHED - Total time 42 seconds
我想要做的是,以在任何给定时间并行运行 3 个任务的方式运行它。我希望它运行T_1、T_2 和T_3 并且作为T2 仅任务2 秒,一旦它完成加载T_4 到它而不是等待所有3 完成但只有3 Max 在任何给定的时间。
我怎样才能实现这种行为?
【问题讨论】:
-
TaskScheduler的文档中给出了一个有限并发任务调度程序的示例 -
尝试在任务列表中添加 then 然后 Task.WhenAll(tasks.AsParallel().Select(async task => await task()));
-
stackoverflow.com/questions/38634376/…你可以在这里找到答案
-
你可以看看这个:How to limit the amount of concurrent async I/O operations? 顺便说一句,由于类名
Method1、Method2等,我投了反对票。命名一个类Method至少可以说是令人困惑.
标签: c# multithreading