【发布时间】:2023-03-16 21:45:01
【问题描述】:
我正在从具有不同数据集标识符的 API 中获取数据作为查询参数。早些时候我尝试了一种同步方法,但它花费了太多时间。所以我决定在 foreach 循环中为每个数据集标识符动态创建任务。这是我写的代码
foreach (var dataset in datasets)
{
Task task = new Task(() =>
{
using (var client = new HttpClient())
{
var urlParameters = $"?apikey={apiKey}&dataset={dataset}";
client.BaseAddress = new Uri(url);
HttpResponseMessage response = client.GetAsync(urlParameters).Result;
var yearlyDatasetResult = response.Content.ReadAsStringAsync().Result;
var datasetCsvHeader = yearlyDatasetResult.Split(new[] { '\r', '\n' })
.FirstOrDefault();
var headers = datasetCsvHeader.Split(';');
if (csvHeaders.Length < headers.Length)
csvHeaders = headers;
var content = yearlyDatasetResult.Substring(datasetCsvHeader.Length);
using (var file = new StreamWriter("C:\\xxxx\\xxxx\\source\\"
+ $"repos\\xxxx\\CSV\\{dataset}.csv"))
{
file.WriteLine(content);
}
}
});
task.Start();
tasksToWait.Add(task);
}
Task.WaitAll(tasksToWait.ToArray());
Console.WriteLine("All tasks completed");
我的目标是获取所有 CSV 文件,然后通过并行运行的任务在没有标题的情况下写入我的系统,但我得到了System.AggregateException。可能是因为这条线的阻塞性质吗?
HttpResponseMessage response = client.GetAsync(urlParameters).Result;
我无法猜测这种异常的原因,我知道其中一项任务失败了,这就是为什么我会收到这个聚合异常,这就是 Task.WaitAll(...) 的本质,可能的情况是什么解决方案?
【问题讨论】:
-
一个 AggregateException 应该包含一个或多个其他异常,这些异常可以准确地告诉您问题出在哪里,但是,是的,我猜这是阻塞调用以及您甚至没有
await的事实Task.WaitAll。你真的应该承诺使用 async/await。 -
此行执行过程中发生异常?
HttpResponseMessage response = client.GetAsync(urlParameters).Result; -
@RichárdBaldauf 我只是猜测,即使我也不确定
-
@ShubhamTiwari 啊,好吧。为了弄清楚这一点,我建议克里斯托弗在下面回答。使用 async/await 功能有助于识别异常的来源^.^
标签: c# multithreading asynchronous task