热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

奇怪的等待行为

如何解决《奇怪的等待行为》经验,为你挑选了1个好方法。

我有这样的异步方法

public async Task FooAsync() 
{ 
    return await SomeThirdPartyLib.SomeMethodReturningBoolAsync().ConfigureAwait(false);
}

然后我有一个代码在循环中调用它:

for (var i = 0; i <10; i++)
{
    ok &= await FooAsync().ConfigureAwait(false);
}

在我的情况下,这将在2或3或其他数量的周期后挂起我的过程.但是当我将代码更改为

for (var i = 0; i <10; i++)
{
    ok &= await FooAsync()
        .ContinueWith(t => {
            if (t.IsCompleted)
            {
                return t.Result;
            }
            return false;
        })
        .ConfigureAwait(false);
}

完全相同的代码工作.有任何想法吗?

编辑:我刚刚改变了我的示例代码,以显示FooAsync原则上的内容.回答一些已经给出的答案和评论:我不确切知道是什么SomeMethodReturningBoolAsync.事实上,我ContinueWith实际上没有任何用处,这让我很震惊.



1> Servy..:

FooAsync()尽管名称,实际上是在做其工作同步,这样以来你开始你的UI线程上的工作,它将继续做好各项工作的UI线程.

当您添加ContinueWith一个方法(没有任何效率)在线程池线程上运行时,所以只有第一个FooAsync调用实际上在UI线程上运行.作为结果,所有后续调用都将在线程池线程上ConfigureAwait(false).

正确的解决方法是实际调整FooAsync,使得它实际上它的工作异步,而不是同步,或者如果它没有做任何概念异步工作方式,那么它应该是一个同步的方法,而不是返回Task,并与被称为Task.Run在这里的方法,因为它需要在另一个线程中进行同步工作.


推荐阅读
author-avatar
手机用户2502896757
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有