2013-04-05 158 views
2

Backgound:我必须调用Web服务调用1500次,这需要大约1.3秒的时间才能完成。 (无法控制此第三方API。)总计时间= 1500 * 1.3 = 1950秒/ 60秒=大致32分钟。提高异步Web调用的性能

我想出了我虽然是一个很好的解决方案,但它没有泛出那么好。 因此,我改变了异步Web调用的电话,认为这会显着帮助我的结果它没有。

示例代码:

预优化:

foreach (var elmKeyDataElementNamed in findResponse.Keys) 
{ 

    var getRequest = new ElementMasterGetRequest 
    { 
     Key = new elmFullKey 
     { 
      CmpCode = CodaServiceSettings.CompanyCode, 
      Code = elmKeyDataElementNamed.Code, 
      Level = filterLevel 
     } 
    }; 

    ElementMasterGetResponse getResponse; 
    _elementMasterServiceClient.Get(new MasterOptions(), getRequest, out getResponse); 
    elementList.Add(new CodaElement { Element = getResponse.Element, SearchCode = filterCode }); 
} 

随着优化:

var tasks = findResponse.Keys.Select(elmKeyDataElementNamed => new ElementMasterGetRequest 
    { 
     Key = new elmFullKey 
      { 
       CmpCode = CodaServiceSettings.CompanyCode, 
       Code = elmKeyDataElementNamed.Code, 
       Level = filterLevel 
      } 
    }).Select(getRequest => _elementMasterServiceClient.GetAsync(new MasterOptions(), getRequest)).ToList(); 

Task.WaitAll(tasks.ToArray()); 

elementList.AddRange(tasks.Select(p => new CodaElement 
    { 
     Element = p.Result.GetResponse.Element, 
     SearchCode = filterCode 
    })); 

较小的采样实例: 所以能够轻松测试我做了60笔较小的取样本花了60秒没有优化,优化只花了50秒。我想尽管它已经接近30或更好。

我用wireshark来观察交易过程,并意识到异步方式没有像我认为的那样快速发送。

异步请求捕获 Async requests captured

普通无优化 Normal no optimization 你可以看到asnyc推几个非常快,然后脱落...... 另外请注意,要求10和11之间花了将近3秒。

创建线程的开销是否会减慢需要秒数的任务? 注:我所指的任务是4.5 TAP任务库。

为什么请求会比这更快。 我被告知我打的Apache Web服务器可以容纳200个最大线程,所以我没有看到一个问题。

我是不是在想这个很清楚? 在调用Web服务时,异步请求有没有什么优势? 我有代码错误吗? 任何想法都会很棒。

+0

出的1.3秒钟,这两点需要执行一个电话,其实是如何的那个时候花了多少钱在服务器上执行的工作?如果服务器需要1.2秒来执行工作并且存在资源限制,则异步可能没有什么区别。 – Pete 2013-04-05 18:42:33

+0

了解服务器可能总是需要1.3秒,但如果请求同时运行,那么它应该消耗更多的时间正确吗? – retslig 2013-04-05 18:52:37

+0

这取决于资源的限制。有些事情不会从并发中受益,有些事情甚至会受到它的伤害。这取决于什么导致服务器花费1.3秒。它可能不会从并发中受益。 – Pete 2013-04-05 19:17:53

回答

2

经过搜索,我发现这个职位,解决了我的问题很多天: Trying to run multiple HTTP requests in parallel, but being limited by Windows (registry)

的原因,请求不打服务器更快是因为太我的客户端代码,并没有与服务器做。默认情况下,C#只允许2个并发请求。 请参阅:http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx

我只是简单地添加了这行代码,然后所有请求都以毫秒为单位。

System.Net.ServicePointManager.DefaultConnectionLimit = 50; 

enter image description here

+0

那么你是否也在引用的帖子中对注册表进行了更改,或者您只更改了System.Net.ServicePointManager.DefaultConnectionLimit? – 2013-10-25 01:51:47

+0

没有需要注册表更改,这是严格的IE浏览器(如果我没记错的话),这并没有处理。 – retslig 2013-10-25 14:54:55