如何延迟"热"任务,以便按设定顺序处理它们

Cle*_*eve 1 c# asynchronous task task-parallel-library async-await

说我有一组任务:

        var task1 = DoThisAsync(...);
        var task2 = DoThatAsync(...);
        var task3 = DoOtherAsync(...);
        var taskN...
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法来按顺序处理一组任务(由包含集合中的位置确定),但让任务只在轮到他们而不是之前运行/启动 - 并且所有这些都包含在其中自己的任务.

问题限制/细节是:

  1. 这些任务需要按特定顺序执行ietask1,task2,...
  2. 上一个任务必须在下一个任务开始之前异步完成
  3. 任务数量是可变的
  4. 每次运行代码时,都可以指定一组不同的任务
  5. 任务的顺序和数量是事先已知的.

主要问题是,只要我调用相关方法(如DoThis()...)返回每个任务,该任务就已经"热"或正在运行,违反了上面的(2).

我曾尝试使用.ContinueWith(..),但是如果我调用上面的每个任务来设置延续或将它们添加到列表或集合中,那么它们已经开始了.

不确定Lazy <T>是否有帮助但目前看不清楚怎么样?

希望这是有道理的,因为我对async/await/tasks很新.

提前谢谢了.

Ste*_*ary 8

调用方法运行代码.如果你想要一个对象,它会调用这个方法,再使用委托.

在这种情况下,您可以使用Func<Task>,这是一个异步委托.这些列表应该足够了:

// Build the list of operations in order.
var operations = new List<Func<Task>>();
operations.Add(() => DoThisAsync(...));
operations.Add(() => DoThatAsync(...));
operations.Add(() => DoOtherAsync(...));

// Execute them all one at a time.
foreach (var operation in operations)
  await operation();
Run Code Online (Sandbox Code Playgroud)