【问题标题】:How to make one task run after a collection of tasks has finished in C#?如何在 C# 中完成一组任务后运行一个任务?
【发布时间】:2021-06-14 02:18:19
【问题描述】:

我有一组任务必须在最后一个任务运行之前完成。具体来说:

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        var task1 = Task.Run(() =>
        {
            Thread.Sleep(5000);
            Console.WriteLine("Task1");
        });

        var task2 = Task.Run(() =>
        {
            Thread.Sleep(5000);
            Console.WriteLine("Task2");
        });

        var task3 = Task.Run(() =>
        {
            Thread.Sleep(5000);
            Console.WriteLine("Task2");
        });

        var last = Task.Run(() =>
        {
            Console.WriteLine("Last");
        });

        var tasks = new List<Task>();
        tasks.Add(task1);
        tasks.Add(task2);
        tasks.Add(task3);

        await Task.WhenAll(tasks).ContinueWith(t => last);
    }

目前他们的结局是这样的:

Last
Task2
Task3
Last1

我希望他们像这样结束:

Task1
Task2
Task3
Last

前 3 个的顺序无关紧要,重要的是 Last 任务最后完成。 我不能阻塞线程或等待集合完成和类似的东西,只有 Last 任务必须在前三个完成后执行。

【问题讨论】:

  • 你不应该开始最后一个任务
  • 不要使用ContinueWith?

标签: c# asp.net .net asynchronous task


【解决方案1】:

任务是“热”创建的,即已经在进行中。如果您想延迟任务的启动,请使用委托 (Func&lt;Task&gt;) 或单独的 async 方法。

我喜欢这种行为的本地 async 方法:

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
  async Task Task1() => Task.Run(() =>
  {
    Thread.Sleep(5000);
    Console.WriteLine("Task1");
  });

  async Task Task2() => Task.Run(() =>
  {
    Thread.Sleep(5000);
    Console.WriteLine("Task2");
  });

  async Task Task3() => Task.Run(() =>
  {
    Thread.Sleep(5000);
    Console.WriteLine("Task2");
  });

  async Task Last() => Task.Run(() =>
  {
    Console.WriteLine("Last");
  });

  var tasks = new List<Task>();
  tasks.Add(Task1());
  tasks.Add(Task2());
  tasks.Add(Task3());

  await Task.WhenAll(tasks);
  await Last();
}

附: Don't use ContinueWith.

【讨论】:

  • 是的,它按照我想要的方式工作。谢谢!
【解决方案2】:
    //var last = Task.Run(() =>
    //{
    //    Console.WriteLine("Last");
    //});

    var tasks = new List<Task>();
    tasks.Add(task1);
    tasks.Add(task2);
    tasks.Add(task3);

    await Task.WhenAll(tasks);  //.ContinueWith(t => last);

    Task.Run(() =>
    {
        Console.WriteLine("Last");
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 2014-06-21
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多