簡體   English   中英

如何在 C# 中完成一組任務后運行一個任務?

[英]How to make one task run after a collection of tasks has finished in C#?

我有一組任務必須在最后一個任務運行之前完成。 具體來說:

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任務最后完成。 我不能阻塞線程或等待收集完成和類似的東西,只有最后一個任務必須在前三個完成后執行。

任務是“熱”創建的,即已經在進行中。 如果要延遲任務的啟動,請使用委托 ( Func<Task> ) 或單獨的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();
}

PS 不要使用ContinueWith

    //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");
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM