我有以下 Blazor 服务器代码,该代码调用不等待的异步任务,而是使用 while 循环来检查任务的完成或异常。我遇到的问题是 while 循环似乎只运行一次,然后似乎就停止了。该任务没有错误且未完成,但一旦完成,它就会退出 while 循环并按预期继续。
任何人都可以解释一下这里发生了什么吗?
private async Task Generate()
{
awaitingRequest = true;
StateHasChanged();
var result = gPT.SendCommand("system", bot.Description, apiKey, true);
try
{
loopCount = 0;
while (!result.IsCompleted && !result.IsFaulted)
{
//Update the UI after the asynchronous operation
await Task.Delay(500);
loopCount++;
StateHasChanged();
}
}
catch (Exception ex)
{
}
outputText = gPT.messages[1].content;
awaitingRequest = false;
StateHasChanged();
}
我尝试了各种断点,并将loopCount绑定到文本区域控件以进行视觉确认,两者都只是表明它在第二次调用await Task.Delay(500)后停止在while循环中。我尝试设置ConfigureAwait(false),但没有什么区别。我基本上希望在 gPT.SendCommand 方法运行时更新 UI。我以前用过这种方法,效果很好,所以我不知道是什么原因造成的。
我认为问题在于 gPT.SendCommand 虽然是一个异步任务,但没有在自己的线程上运行。使用 Task.Run 解决了这个问题。也许有人可以证实这一点。
var result = Task.Run(() => gPT.SendCommand("system", bot.Description, apiKey, true));