使用Parallel.Foreach进行多个web服务调用

本文关键字:web 服务 调用 Parallel Foreach 使用 | 更新日期: 2023-09-27 17:53:11

我需要处理从web服务中检索到的多个数据,这些数据只获取我的单个信息,如下面的示例:

List<string> products = GetAllProducts();
List<ProductInfo> productsInfo = new List<ProductInfo>();
using (var channel = GetClientChannel<IService>("http://localhost:51383/Service/Service.svc"))
{
    Parallel.ForEach(products, product =>
    {
        Request myRequest = new Request();
        Response myResponse = null;
        try
        {
            myRequest.ID = product;
            myResponse = channel.GetProductInfo(myRequest);
            productsInfo.Add(myResponse.Info);
        }
        catch (Exception ex)
        {
            // Continue build ProductInfo list
        }
    });
}
DoSomething(productsInfo);
对于这样的事情,最好的方法是什么?每个并行是否会提高性能,或者因为我在同一主机/端口调用服务而不会受到影响?

使用Parallel.Foreach进行多个web服务调用

如果您的服务不是并发的,我认为对每个服务进行并行处理不会有太大的区别,因为对服务的调用一次只处理一个。您需要做的是使用以下命令使您的服务并发:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
class MyService : IMyService

或更改服务行为中的InstanceContext模式,以便每次对服务的调用都会在托管服务的服务器上创建一个新进程,如

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]
class MyService : IMyService

如果您做了以上任何一项,请确保您处理好与线程相关的问题。有关这些属性的更多信息,请参见WCF并发教程