代码在LinqPad中并行运行,但不在Console App中运行...为什么?

时间:2016-05-18 09:16:53

标签: .net task-parallel-library linqpad

我需要针对不同的日期范围对单个Web服务进行一系列调用,并生成连接的结果集。虽然我在这方面的经验有限,但我想并行拨打电话来加快这个过程。

我尝试了几种技术,但根据执行时间,当我在Visul Studio控制台应用程序中运行时,我的代码调用会继续按顺序运行。我的意思是,如果一个月的日期范围的呼叫需要15秒,那么这一个月的呼叫中的三个(据称并行运行)需要45秒。

但是这部分让我感到惊讶:我开始在LinqPad中运行完全相同的代码以便于调试。瞧,在LinqPad中,相同的代码并行运行!召唤3个月总共需要15秒!

现在我正在摸索着这是怎么回事。我已经尝试将LinqPad版本复制到一个新的conole项目(以便仔细检查两个版本中的所有内容是否真的相同),但它并没有改变行为。

我很感激任何建议。我不确定哪个代码与此问题相关,但我在下面列出了一个稍微简化的Web服务调用类版本:

class Importer
{
    public List<FuncDetails> GetAllData(DateRange[] intervals)
    {
        Task<List<PropFuncsType>>[] tasks = intervals
            .ToList()
            .Select(interval => GetDataForIntervalAsync(interval.StartDate, interval.EndDate))
            .ToArray();

        var result = new List<ResultDataTable>();
        Task.Factory.ContinueWhenAll(tasks, results => { foreach (var output in results) { result.AddRange(output.Result); } })
        .Wait();

        return result.SelectMany(x => x.ResultDataRow).ToList();

    }

    async static private Task<List<ResultDataTable>> GetDataForIntervalAsync(DateTime startDate, DateTime endDate)
    {
        var service = new ServiceClient();

        var result = await service.getDataAsync(new ServiceRequest()
            {
                startDate = string.Format("{0:yyyy-MM-dd}", startDate),
                endDate = string.Format("{0:yyyy-MM-dd}", endDate)
            }
        );

        return result.ServiceResponse.ToList();
    }
}

1 个答案:

答案 0 :(得分:2)

尝试在控制台应用启动时将ServicePointManager.DefaultConnectionLimit设置为int.MaxValue。这是.NET上HTTP限制的常见但微妙的原因。

(据推测,LINQPad已经做了类似的事情)。