我需要针对不同的日期范围对单个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();
}
}
答案 0 :(得分:2)
尝试在控制台应用启动时将ServicePointManager.DefaultConnectionLimit
设置为int.MaxValue
。这是.NET上HTTP限制的常见但微妙的原因。
(据推测,LINQPad已经做了类似的事情)。