C# 任务。延迟不返回主线程

C# 任务。延迟不返回主线程,c#,multithreading,async-await,C#,Multithreading,Async Await,我正在测试async/await,问题就在这里。我正在异步启动两个任务,并等待它们的执行完成。我希望这两个任务分别等待延迟,然后返回打印总已用毫秒数。但是程序只打印1开始“+当前时间和2开始“+当前时间,但之后不打印。如何从延迟的任务返回并打印最终结果 static void Main(string[] args) { RunTasksWithDelays(); } static async void RunTasksWithDelays()

我正在测试async/await,问题就在这里。我正在异步启动两个任务,并等待它们的执行完成。我希望这两个任务分别等待延迟,然后返回打印总已用毫秒数。但是程序只打印
1开始“+当前时间
2开始“+当前时间
,但之后不打印。如何从延迟的任务返回并打印最终结果

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

    }

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


然后您只需调用
RunTasksWithDelays().Wait()

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


然后您只需调用
RunTasksWithDelays().Wait()

主线程结束,程序也随之结束,因为应用程序中没有前台线程来保持程序的活动状态


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

  • 您的方法不会返回
    Task
  • Main
    方法不支持
    wait
  • 您应该使RunTasksWithDelays方法返回
    async Task
    而不是
    async void
    ,并且应该等待其完成。同步等待是一个坏主意,在这种情况下这没关系,因为我们没有任何选择

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

    主线程结束,程序也随之结束,因为应用程序中没有前台线程来保持程序的活动状态


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

  • 您的方法不会返回
    Task
  • Main
    方法不支持
    wait
  • 您应该使RunTasksWithDelays方法返回
    async Task
    而不是
    async void
    ,并且应该等待其完成。同步等待是一个坏主意,在这种情况下这没关系,因为我们没有任何选择

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

    RunTasksWithDelays
    是一个无效方法。捕捉得好,我看到了async关键字和我的大脑插入任务。
    RunTasksWithDelays
    是一个无效方法。捕捉得好,我看到了async关键字和我的大脑插入任务。这很有效。我知道我需要等待,但不知道如何在Main中完成。有没有办法知道在整个执行过程中产生了多少线程?@Sam不,没有。操作可能在没有任何单个线程或N个线程的情况下完成。没有办法找到答案(阿飞)。这是有效的。我知道我需要等待,但不知道如何在Main中完成。有没有办法知道在整个执行过程中产生了多少线程?@Sam不,没有。操作可能在没有任何单个线程或N个线程的情况下完成。没有办法找到答案。