线程化web服务调用的最佳技术

本文关键字:最佳 技术 调用 服务 web 线程 | 更新日期: 2023-09-27 18:17:23

我有一个网站,需要调用web服务1到10,000次。目前这是在foreach循环中完成的,像这样:

List<Address> addresses
List<Response> responses = new List<Response>();
foreach(Address address in addresses){
  //Setup web service call
  //Call web service
  //Parse response into object for front end
  responses.Add(CustomReponseObject)
}
// The responses object is then just serialized and set to the front end client to parse through.

当前的方法不是线程,我想加快它。不确定我是否应该使用托管线程或使用新的Async Await关键字。

我开始这个过程,然后挂了如果新的Async关键字可能工作,使用响应列表上的锁,或者如果像ConcurrentBag这样的东西可能需要?我已经通读了所有三个选项,但不确定哪个选项最适合我的用例?

线程化web服务调用的最佳技术

您应该使用async/await,因为它将在等待调用web服务的IO操作完成时最大限度地减少托管线程的使用。

在MSDN上有一个完整的例子显示了这个确切的模式。

至于容器,如果坚持使用List<T>,则必须在每个线程添加时通过锁来控制对列表的访问,因为该类在修改时不是线程安全的(多个线程可以并发读取)。

一个更好的选择是ConcurrentQueue<T>,因为它针对这种读/写模式进行了优化(感谢@Scott的观察)。