【发布时间】:2016-10-12 17:21:23
【问题描述】:
我正在使用 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() 函数中,Task 'response' 状态永远不会更改为 RanToCompletion 并且始终处于 WaitingForActivation 状态。我已经尝试增加等待超时但仍然没有运气。我正在使用 TaskFactory 而不是 Task,因为将来我想创建自定义 TaskFactory 以更好地控制调度程序和并发。
这是我的代码中缺少的东西,内部任务永远不会被执行吗?
编辑 我根据删除不必要线程的评论修改了调用 doAPICall() 的代码,但仍然没有运气。 :-(
var task = Task.Factory.StartNew(() =>
{
// Do API Call
var saveResponse = doAPICall();
});
task.Wait();
【问题讨论】:
-
为什么所有这些额外的任务东西,我很认真地问,因为你使用了更多的线程然后是必要的(超过 1 是不必要的)。如果您的 API 调用默认不是异步的,那么正确的做法是使用 TaskCompletionSource 并且不启动线程。
-
我的外部 API 调用是一个返回任务的异步函数。
-
您是否尝试从同步代码中调用异步代码?
-
doAPICall() 对外部 API 的函数调用是异步调用,而 doAPICall 是从 Task.Run 调用的
-
client.FindBags(request) 是返回任务,Findbags 是异步函数。
标签: c# .net task-parallel-library task taskfactory