gpt4 book ai didi

c# - 等待的奇怪行为

转载 作者:行者123 更新时间:2023-11-30 20:17:16 25 4
gpt4 key购买 nike

我有一个这样的异步方法

public async Task<bool> 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 实际上没有做任何有用的事情,这让我感到震惊。

最佳答案

您的 FooAsync() 尽管有名称,但实际上是在同步执行其工作,因此由于您是在 UI 线程上开始工作,它将继续在 UI 上执行所有工作线程。

当您在 ContinueWith 中添加时,您将强制一个方法(没有任何生产性)在线程池线程上运行,因此只有第一个 FooAsync 调用是实际上在 UI 线程上运行。由于 ConfigureAwait(false),所有后续调用都将在线程池线程上进行。

正确 修复是实际调整 FooAsync 以便它实际上异步而不是同步地完成它的工作,或者如果它不做任何概念上的异步工作,那么它应该是一个同步方法,而不是返回一个Task,并且在你的方法中用Task.Run调用,因为它需要在另一个线程中执行同步工作。

关于c# - 等待的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45306681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com