gpt4 book ai didi

c# - TaskFactory 内部任务永远不会执行并且始终处于 WaitingForActivation 状态

转载 作者:行者123 更新时间:2023-11-30 21:51:08 29 4
gpt4 key购买 nike

我正在使用 TaskFactory 使用以下代码启动新任务。

var task = Task.Factory.StartNew(async () =>
{
await Task.Run(() =>
{
// Do API Call
var saveResponse = doAPICall();
}).ConfigureAwait(false);
}).Unwrap();

task.Wait();

doAPICall() 的代码如下所示,它调用一个返回任务的外部 API。

private string doAPICall()
{
Task<string> response = client.FindBags(request);
response.Wait(60000);

if (response.Status == TaskStatus.RanToCompletion)
{
return response.Result;
}
}

问题出现在 doAPICall() 函数中,任务“响应”状态永远不会更改为 RanToCompletion,它始终处于 WaitingForActivation 状态。我已经尝试增加等待超时但仍然没有运气。我正在使用 TaskFactory 而不是 Task,因为将来我想创建自定义 TaskFactory 以更好地控制调度程序和并发性。

我的代码中是否缺少内部任务永远不会执行的东西?

编辑我根据删除不必要线程的评论修改了调用 doAPICall() 的代码,但仍然没有运气。 :-(

var task = Task.Factory.StartNew(() =>
{
// Do API Call
var saveResponse = doAPICall();
});

task.Wait();

最佳答案

您当前正在使用 sync-over-fake-async-over-fake-async-over-sync-over-async。那真是一团糟。

遵循这些准则:

  1. 不要使用 Task.Factory.StartNew。曾经。 我正在使用 TaskFactory 而不是 Task,因为将来我想创建自定义 TaskFactory 以更好地控制调度程序和并发性。 自定义任务调度程序不适用于异步代码。您可能必须采用更加异步友好的调度/并发解决方案。更多信息 on my blog .
  2. 不要阻塞异步代码。我看到两个 Wait 调用和一个 Result,它们都是严重的危险信号。更多信息 on my blog .
  3. 不要在生产代码中使用 Task.Status。它可以用于调试,但您不应该将它用于实际逻辑。总有更好的解决方案。更多信息 on my blog .
  4. 仅使用来自 UI 层的 Task.Run,而不是嵌套在帮助程序/库代码中。换句话说,用它来调用方法,而不是实现方法。更多信息 on my blog .

从最里面的方法开始:

private async Task<string> doAPICallAsync()
{
Task<string> responseTask = client.FindBags(request);
// Note: it would be far better to use a cancellation token here instead of a "timed wait".
Task timeoutTask = Task.Delay(60000);
Task completedTask = await Task.WhenAny(responseTask, timeoutTask);
if (completedTask == responseTask)
return await completedTask;
}

您的调用代码变为:

var saveResponse = await doAPICallAsync();

关于c# - TaskFactory 内部任务永远不会执行并且始终处于 WaitingForActivation 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35884375/

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