奇怪的等待行为

Ale*_*idt 2 c# task-parallel-library async-await

我有这样的异步方法

public async Task<bool> FooAsync() 
{ 
    return await SomeThirdPartyLib.SomeMethodReturningBoolAsync().ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

Ser*_*rvy 6

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

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

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