【发布时间】:2019-02-13 10:19:51
【问题描述】:
我正在尝试执行多个内部调用一些 http 调用的任务。 问题是当我使用 Parallel.ForEach 循环时出现错误:
tasks 参数包含一个空值。参数名称:任务
List<Task> TskList = new List<Task>();
Parallel.ForEach(dt.AsEnumerable(), row =>
//foreach (DataRow row in dt.Rows)
{
var oTsk =
new Task(
() =>
{
try
{
some http call
}
catch (Exception ex)
{
//AppendTextBox(row["ssub_msisdn"] as string + ", Error: " + ex.Message, txtBoxResponse);
}
});
TskList.Add(oTsk);
oTsk.Start();
}
);
var t = Task.WhenAll(TskList.ToArray());
try
{
await t;
}
catch { }
if (t.Status == TaskStatus.RanToCompletion)
{
SetLabel("Completed", lblProcessingStatus);
}
else if (t.Status == TaskStatus.Faulted)
{ SetLabel("Faulted", lblProcessingStatus); }
【问题讨论】:
-
您不需要使用
Parallel.ForEach或Task.Run来并行执行http 请求。向我们展示some http call代码,我们可以向您展示如何改进它。 -
@KamranShahid:请描述你真正想要做什么。这段代码中有很多危险信号:永远不要使用
Task构造函数和Task.Start; HTTP 调用是基于 I/O 的,不需要Parallel.ForEach;有一个空的 catch 块;并且代码正在使用Task.Status进行调试以外的其他事情。 -
@StephenCleary:catch 块正在尝试将错误消息添加到 TextBox,但由于调用是从后台线程完成的,因此这实际上从未起作用,因此该调用被注释掉了。
标签: c# .net multithreading task-parallel-library .net-4.5