限制异步执行

时间:2014-04-09 18:12:53

标签: async-await linq-to-objects c#-5.0

假设我有一组需要异步处理的对象。

List<Customer> customers = GetAllCustomers();

customers.ForEach(async (e) => { await e.Process(); });

我认为这些将在不保持当前线程的情况下异步处理。我想知道的是,该集合中的客户数量是否有限制。如果它是100,000怎么办。它会在异步队列中排队吗?

**我也不确定这是不是正确的做法。我真的不需要等待每个客户处理的结果。我只想无缝地处理所有客户数据。我不关心每个进程是否失败,因为它会被重新拾取直到成功。我可以使用任务,但我宁愿不创建线程导致可能的比赛条件等。**

2 个答案:

答案 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());