等待任务内的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.StartNew
和async-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。