2

背景:我必须调用 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 来观察交易,并意识到异步方式的发送速度并没有我想象的那么快。

捕获的异步请求 捕获的异步请求

正常无优化 正常无优化 您可以看到异步推送非常快,然后下降......还请注意,在请求 10 和 11 之间花了将近 3 秒。

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

为什么请求不会比这更快。有人告诉我,我正在访问的 Apache Web 服务器最多可以容纳 200 个线程,所以我在那里看不到问题。

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

4

1 回答 1

2

经过多天的搜索,我发现这篇文章解决了我的问题: 尝试并行运行多个 HTTP 请求,但受到 Windows(注册表)的限制

请求没有更快地到达服务器的原因也是由于我的客户端代码与服务器无关。默认情况下,C# 只允许 2 个并发请求。见这里:http: //msdn.microsoft.com/en-us/library/system.net.servicepointmanager.defaultconnectionlimit.aspx

我只是添加了这行代码,然后所有请求都在几毫秒内完成。

System.Net.ServicePointManager.DefaultConnectionLimit = 50;

在此处输入图像描述

于 2013-04-17T21:38:29.420 回答