【发布时间】:2017-12-13 07:48:22
【问题描述】:
我正在尝试同时调用许多不同的 Web 服务并聚合数据。
我的意图是为每个网络调用创建一个任务,将一个共享容器传递给每个任务,并将每个调用的数据存储在容器中。只要我能从每个网络调用中获取数据到共享容器中,我就很高兴。
我已经创建了一个我正在尝试做的示例 - 但是,它有时会崩溃并在 Task.WaitAll 行上出现异常:“发生一个或多个错误。(源数组不够长。检查源索引、长度和数组的下限。 参数名称:sourceArray)"。
我不熟悉使用异步/等待和多线程。
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Threading.Tasks;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Starting tasks...");
List<Task> tasks = new List<Task>();
List<char> container = new List<char>();
for (int i = 0; i < 80; i++)
{
tasks.Add(LongTask(container));
}
Task.WaitAll(tasks.ToArray());
Console.WriteLine("Checkpoint 1.");
Console.WriteLine("Tasks Finished");
Console.ReadLine();
}
public static async Task<string> LongTask(List<char> container)
{
var client = new HttpClient();
var text = await client.GetAsync("http://www.google.com");
var myList = text.StatusCode.ToString().ToList();
container.AddRange(myList);
return text.StatusCode.ToString();
}
}
}
【问题讨论】:
-
List
.AddRange( ) 不是线程安全的。您是否尝试过使用 ConcurrentBag 之类的东西? -
请看答案
标签: c# multithreading async-await