C# 始终一次运行3个任务

C# 始终一次运行3个任务,c#,multithreading,C#,Multithreading,我有一个场景,需要并行运行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 S

我有一个场景,需要并行运行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个任务

我怎样才能做到这一点

在任何给定的时间内最多只有3个

执行异步并发(术语说明:非并行)的正常方法是使用
信号量lim

var throttler = new SemaphoreSlim(3);
var task1 = Throttled(m1.FetchAsync);
var task2 = Throttled(m2.FetchAsync);
var task3 = Throttled(m3.FetchAsync);
var task4 = Throttled(m4.FetchAsync);
var task5 = Throttled(m5.FetchAsync);
var task6 = Throttled(m6.FetchAsync);
await Task.WhenAll(tasks);

async Task<T> Throttled<T>(Func<Task<T>> operation)
{
  await throttler.WaitAsync();
  try { return await operation(); }
  finally { throttler.Release(); }
}
var throttler=新信号量lim(3);
var task1=节流(m1.FetchAsync);
var task2=节流(m2.FetchAsync);
var task3=节流(m3.FetchAsync);
var task4=节流(m4.FetchAsync);
var task5=Throttled(m5.FetchAsync);
var task6=节流(m6.FetchAsync);
等待任务。何时(任务);
异步任务已限制(Func操作)
{
wait throttler.WaitAsync();
请尝试{返回等待操作();}
最后{throttler.Release();}
}

文档中给出了一个有限并发任务调度器的示例,用于尝试将其添加到任务列表中,然后添加到任务.whalll(tasks.aspallel().Select(async task=>wait task());你可以在这里找到你的答案。你可以看看这个:顺便说一句,我投了反对票,因为类名
Method1
Method2
等等。命名一个类
Method
至少让人困惑。这正是我所做的,非常感谢你