假设我有一组需要异步处理的对象。
List<Customer> customers = GetAllCustomers();
customers.ForEach(async (e) => { await e.Process(); });
我认为这些将在不保持当前线程的情况下异步处理。我想知道的是,该集合中的客户数量是否有限制。如果它是100,000怎么办。它会在异步队列中排队吗?
**我也不确定这是不是正确的做法。我真的不需要等待每个客户处理的结果。我只想无缝地处理所有客户数据。我不关心每个进程是否失败,因为它会被重新拾取直到成功。我可以使用任务,但我宁愿不创建线程导致可能的比赛条件等。**
答案 0 :(得分:4)
我想知道的是,对于该系列中的客户数量是否有限制。如果它是100,000怎么办。它会在异步队列中排队吗?
没有限制。但是,每次处理启动一次一个;也就是说,Process
方法(我假设它是异步的,应该被称为ProcessAsync
)将为每个项目调用一次,为每个项目返回Task<T>
。
如果您确实希望(异步)等待完成所有任务,可以使用Task.WhenAll
:
await Task.WhenAll(customers.Select(e => e.Process()));
答案 1 :(得分:0)
Tasks
更适合这种类型的加载,你可以设置选项来控制多少线程等。
List<Task> tasks = new List<Task>();
customers.ForEach((e) => { Task task = Task.Run(() =>{ e.Process(); tasks.Add(task);})});
Task.WaitAll(tasks.ToArray());