Task.Delay不返回主线程

时间:2014-10-28 07:20:37

标签: c# multithreading async-await

我正在测试async / await,这是问题所在。我异步启动两个任务并等待执行完成。我希望这两个任务等待各自的延迟,然后返回打印总的毫秒数。但该程序仅打印1 start " + current time2 start " + current time,但之后没有任何内容。如何从延迟的任务返回并打印最终结果?

    static void Main(string[] args)
    {
        RunTasksWithDelays();
    }

    static async void RunTasksWithDelays()
    {
        Stopwatch s = Stopwatch.StartNew();

        Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
        Task task1 = LongRunningTask1();
        Task task2 = LongRunningTask2();

        await Task.WhenAll(task1, task2);
        Console.WriteLine("total milliseconds elapsed:  " + s.ElapsedMilliseconds / 1000);

    }

    static async Task LongRunningTask1()
    {
        Console.WriteLine("1 start " + DateTime.Now);
        await Task.Delay(5000);
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
        Console.WriteLine("1 end " + DateTime.Now);

    }

    static async Task LongRunningTask2()
    {
        Console.WriteLine("2 start " + DateTime.Now);
        await Task.Delay(2000);
        Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
        Console.WriteLine("2 end " + DateTime.Now);

    }

2 个答案:

答案 0 :(得分:4)

您的主线程结束,因此程序结束,因为您的应用程序中没有前台线程来保持程序存活。

理想情况下,您应该等待RunTasksWithDelays方法,但出于两个原因,您无法等待它

  1. 您的方法不会返回Task
  2. Main方法不支持await
  3. 您应该使RunTasksWithDelays方法返回async Task而不是async void,您应该等待它完成。同步等待是一个坏主意,在这种情况下这很好,因为我们没有任何选择。

    static void Main(string[] args)
    {
        RunTasksWithDelays().Wait();
    }
    
    static async Task RunTasksWithDelays()
    {
        ...
    }
    

答案 1 :(得分:2)

您的方法RunTasksWithDelays应该返回一个任务,让调用者等待此任务完成。

然后您只需拨打RunTasksWithDelays().Wait();

即可