[英]Waiting for async/await inside a task
我的main()
有这个构造,它创建
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
for t 时,它不会等待对DoBar()
的调用完成。 我如何让它真正等待?
不鼓励将Task.Factory.StartNew
与async-await
一起使用,您应该使用Task.Run
代替:
var t = Task.Run(
async () =>
{
Foo.Fim();
await Foo.DoBar();
});
Task.Factory.StartNew
api 是在基于任务的异步模式 (TAP)和async-await
之前构建的。 它将返回Task<Task>
因为您正在使用 lambda 表达式启动一个任务,该表达式恰好是异步的,因此返回一个任务。 Unwrap
将提取内部任务,但Task.Run
会隐式地为您执行此操作。
为了更深入的比较,总有一篇相关的 Stephen Toub 文章: Task.Run vs Task.Factory.StartNew
似乎我通过Unwrap()
任务获得了所需的功能。 我不太确定我明白这背后的原因,但我认为它有效。
var t = Task.Factory.StartNew(
async () =>
{
Foo.Fim();
await Foo.DoBar();
}).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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.