任务不等待完成

sQuir3l

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

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

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

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

Starting
End
Run finished
Main finished
欣快的

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章