繁体   English   中英

在任务中等待 async/await

[英]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.StartNewasync-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM