任务不等待完成

sQu*_*r3l 2 c# asynchronous

我试图让自己等待和异步,所以我编写了这个小测试应用程序,但是我没有想到的结果。

该程序将继续执行,而不是等待任务完成。

class Program
{
    static void Main(string[] args)
    {
        var task = new Task(Run);
        task.Start();
        task.Wait();

        Console.WriteLine("Main finished");
        Console.ReadLine();
    }

    public async static void Run()
    {
        var task = Task.Factory.StartNew(() =>
        {
            Console.WriteLine("Starting");
            Thread.Sleep(1000);
            Console.WriteLine("End");
        });

        await task;
        Console.WriteLine("Run finished");
    }
}
Run Code Online (Sandbox Code Playgroud)

输出量

Main finished
Starting
End
Run finished
Run Code Online (Sandbox Code Playgroud)

如果我将“等待任务”替换为“ task.Await()”,则它将按预期产生运行

Starting
End
Run finished
Main finished
Run Code Online (Sandbox Code Playgroud)

Eup*_*ric 5

这是因为当您拥有异步void方法时,您无法采取任何措施来跟踪其完成情况。您new Task(Run)只创建一个用于启动Run方法的任务。在首次等待运行到达后,将没有任何方法跟踪方法的进度,因为没有与方法进度相关的信息。要解决此问题,您必须返回Task而不是void等待它,而不是创建新的Task。

async void和之间的区别在这里async Task描述。