等待任务内的asynchronous/等待

我在我的main()中创build了这个构造

 var tasks = new List<Task>(); var t = Task.Factory.StartNew( async () => { Foo.Fim(); await Foo.DoBar(); }); //DoBar not completed t.Wait(); //Foo.Fim() done, Foo.DoBar should be but isn't 

但是,当我.Wait t时,它不会等待DoBar()的调用完成。 我如何才能真正等待?

不build议使用Task.Factory.StartNewasync-await ,你应该使用Task.Run代替:

 var t = Task.Run( async () => { Foo.Fim(); await Foo.DoBar(); }); 

Task.Factory.StartNew api是在基于任务的asynchronous模式(TAP)和async-await之前构build的。 它将返回Task<Task>因为你正在用一个lambdaexpression式开始一个任务,这个lambdaexpression式恰好是asynchronous的,因此返回一个任务。 Unwrap将提取内部任务,但Task.Run将隐式地为你做。


对于更深入的比较,总是有一个相关的Stephen Toub文章: Task.Run vs Task.Factory.StartNew

看起来像我通过解包Unwrap()任务所需的function。 我不太确定我是否能够理解这一点,但我认为它是有效的。

 var t = Task.Factory.StartNew( async () => { Foo.Fim(); await Foo.DoBar(); }).Unwrap(); 

编辑:我已经找了unwrap Unwrap() ddescription: Creates a proxy Task that represents the asynchronous operation of a Task<Task<T>>我认为这是传统的任务,但如果我需要调用unwrap我想没关系。

我最近面临类似的问题,并发现所有你需要做的是DoBar()返回一些值,并使用.Result而不是等待。

 var g = Task.Run(() => func(arg)); var val = g.Result; 

这将等待func返回其输出并将其分配给val。