c# - 提高异步网络调用的性能

标签 c# web-services asynchronous

背景:我必须调用 Web 服务 1500 次,大约需要 1.3 秒才能完成。 (无法控制此第 3 方 API。)总时间 = 1500 * 1.3 = 1950 秒/60 秒 = 大约 32 分钟。

我想出了一个我认为很好的解决方案,但结果并没有那么好。 因此,我将调用更改为异步网络调用,认为这将极大地帮助我的结果,但事实并非如此。

示例代码:

预优化:

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
    }));

较小的采样示例: 因此,为了轻松测试,我对 40 条记录进行了较小的采样,在没有优化的情况下花了 60 秒,优化后只花了 50 秒。我本来希望它会接近 30 或更好。

我使用wireshark来观察交易的完成情况,并意识到异步方式的发送速度没有我想象的那么快。

捕获的异步请求 Async requests captured

正常无优化 Normal no optimization 您可以看到 asnyc 非常快地插入一些然后下降...... 另请注意,请求 10 和 11 之间花费了近 3 秒。

为任务创建线程的开销是否会慢到需要几秒钟? 注:我指的任务是4.5 TAP任务库。

为什么请求不能比这更快。 有人告诉我我所使用的 Apache Web 服务器最多可以容纳 200 个线程,所以我没有发现那里有问题。

我还没有考虑清楚吗? 当调用 Web 服务时,异步请求没有什么优势吗? 我有代码错误吗? 任何想法都会很棒。

最佳答案

经过多天的搜索,我发现这篇文章解决了我的问题: 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

关于c# - 提高异步网络调用的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15840463/

相关文章:

c# - 如何在一个可执行文件中打包安装(框架+应用程序)?

c# - 为什么 C# 锁不应该用于长时间操作?

c# - 在 WCF 服务中传递接口(interface)?

c# - 将变量传递给 catch block

javascript - Node.js - 如何控制异步回调序列?

javascript - 我怎样才能让底部的 console.log 等到它全部完成,然后告诉我答案而不是等待?

c# - C# 中的 Google Analytics API - 请求执行失败 : https://www. google.com/analytics/feeds/accounts/default

java - REST 如何使用 SOAP 作为协议(protocol)?

c# - 如何让 .NET WinForms 组件使用 SET 时区而不是客户端时区?

java - 异步方法调用完成后,Spring 命令行应用程序挂起