任务不等待完成

时间:2014-11-29 12:12:38

标签: 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");
    }
}

输出

Main finished
Starting
End
Run finished

如果我更换等待任务' for' task.Await()'它然后运行,因为我期望生产

Starting
End
Run finished
Main finished

1 个答案:

答案 0 :(得分:5)

这是因为当你使用异步void方法时,你无法做任何事情来跟踪它的完成情况。你的new Task(Run)只创建一个启动Run方法的任务。在Run到达await之后,没有任何东西跟踪方法的进度,因为没有任何东西与方法的进度相关联。要解决此问题,您必须返回Task而不是void并等待,而不是创建新任务。

async voidasync Task之间的差异被描述为here