C#-可以并行运行多个任务吗?

问题描述

所有工作完成后,我的字符串为空。有什么解决办法吗?

string jsonString = "";
List<Task> tasksToWait = new List<Task>();

// ...

foreach (string blah in blahs)
{
    counter++;

    // ...
    
    Task task = new Task(async () =>
    {
        HttpResponseMessage response = await client.GetAsync(baseURL + URLparams);
        response.EnsureSuccessStatusCode();
        string responseBody = await response.Content.ReadAsStringAsync();

        jsonString += responseBody + ",";
    });

    task.Start();
    tasksToWait.Add(task);

    if (counter == 50)
    {
        Task.WaitAll(tasksToWait.ToArray());
        tasksToWait.Clear();

        Console.WriteLine(jsonString);
    }
    
    // ...
}   

为了加快速度,我立即启动多个API请求,而不是一次等待一个。打开其他选项/解决方案。

谢谢!

解决方法

我建议创建任务,然后awaitTask.WhenAll将它们全部使用,然后使用string.Join

它们的顺序与列表中的顺序相同。

如果所有任务均未发生故障且所有任务均未取消,则 结果任务将以RanToCompletion状态结束。的结果 返回的任务将设置为包含所有 所提供任务的结果与提供的顺序相同

public async Task<string> DoStuff(string data)
{
   var response = await _client.GetAsync("");
   response.EnsureSuccessStatusCode();
   ...
   return await response.Content.ReadAsStringAsync();
}

用法

var blahs = new List<string>();

var results = await Task.WhenAll(blahs.Select(DoStuff));

Console.WriteLine(string.Join(",",results));

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...