C# 使用.NET的多线程调用外部Web服务

C# 使用.NET的多线程调用外部Web服务,c#,multithreading,web-services,asynchronous,parallel.foreach,C#,Multithreading,Web Services,Asynchronous,Parallel.foreach,我不熟悉并行编程,但我已经搜索了很多博客和其他网站(包括SO),以实现以下目标:我需要多次调用外部Web服务(我没有代码访问权限)。每次调用大约需要10秒来处理,所以我决定使用并行来提高性能 public BlockingCollection<TransacaoResponse> ExecutarAsync(TransacaoRequest request) { BlockingCollection<TransacaoResponse> l

我不熟悉并行编程,但我已经搜索了很多博客和其他网站(包括SO),以实现以下目标:我需要多次调用外部Web服务(我没有代码访问权限)。每次调用大约需要10秒来处理,所以我决定使用并行来提高性能

    public BlockingCollection<TransacaoResponse> ExecutarAsync(TransacaoRequest request)
    {
        BlockingCollection<TransacaoResponse> listResponse = new BlockingCollection<TransacaoResponse>();
        Parallel.ForEach<Item>(request.Itens, new ParallelOptions() { MaxDegreeOfParallelism = 10 }, (c) =>
        {
            TransacaoResponse responseInner = new TransacaoResponse();
            int result = _operadora.EnviarTransacao(request.Codigo);
            responseInner.Status = result;
            listResponse.Add(responseInner);
        });
        return listResponse;
    }
public BlockingCollection ExecutarAsync(传输请求)
{
BlockingCollection listResponse=新建BlockingCollection();
Parallel.ForEach(request.Itens,new ParallelOptions(){MaxDegreeOfParallelism=10},(c)=>
{
TransacaoResponse responseInner=新的TransacaoResponse();
int result=\u operadora.envirartransaco(request.Codigo);
responseInner.Status=结果;
添加(responseInner);
});
返回列表响应;
}

即使使用Parallel.ForEach和BlockingCollection,返回结果也需要50秒(我测试了调用此方法5次),与标准ForEach的时间相同。我错过了什么?这段代码中是否存在瓶颈?谢谢。

什么是“Enviartransaco”,该方法或子方法中是否有锁?Enviartransaco是我正在调用的Web服务,我的应用程序中只引用了它,因此它对我来说是一个黑盒。除了添加到列表中之外,没有任何阻止代码。也许您还需要复制请求参数对象。或者尝试使用DotPeek之类的工具进行反编译,找出阻塞发生的位置。但是,即使我不知道webservice的实现,也不认为Parallel.ForEach会处理并行性?是的,但仍然有一些代码线程只能一次通过,例如lock语句。我的猜测是,外部服务不会处理来自相同ip/用户/上下文的请求,因此您可能需要复制该requestobject。您可能需要复制请求中涉及的所有内容。这里的一个猜测是,你的网络连接是实际的瓶颈。什么是“Enviartransaco”在该方法或子方法中是否有锁?Enviartransaco是我正在调用的Web服务,我只是在我的应用程序中引用了它,所以它对我来说是一个黑盒。嗯,除了添加到列表中之外,没有任何阻塞代码。也许您还需要复制请求参数对象。或者尝试使用DotPeek之类的工具进行反编译,找出阻塞发生的位置。但是,即使我不知道webservice的实现,也不认为Parallel.ForEach会处理并行性?是的,但仍然有一些代码线程只能一次通过,例如lock语句。我的猜测是,外部服务不会处理来自相同ip/用户/上下文的请求,因此您可能需要复制该requestobject。您可能需要复制请求中涉及的所有内容。这里的一个猜测是,您的网络连接是实际的瓶颈。