【问题标题】:Run 3 Tasks at a time all the time [duplicate]始终一次运行3个任务[重复]
【发布时间】: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_1T_2T_3 并且作为T2 仅任务2 秒,一旦它完成加载T_4 到它而不是等待所有3 完成但只有3 Max 在任何给定的时间。

我怎样才能实现这种行为?

【问题讨论】:

标签: c# multithreading


【解决方案1】:

在任何给定时间只有 3 Max。

做异步并发的正常方式(术语说明:不是并行)是使用SemaphoreSlim:

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

【讨论】:

  • 这正是我所做的,非常感谢
猜你喜欢
  • 1970-01-01
  • 2022-08-03
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 2012-05-30
  • 2021-06-09
相关资源
最近更新 更多