作者:手机用户2502896757 | 来源:互联网 | 2023-01-28 13:55
我有这样的异步方法
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
在这里的方法,因为它需要在另一个线程中进行同步工作.