我需要针对不同的日期范围对单个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();
}
}
尝试设置ServicePointManager.DefaultConnectionLimit
为int.MaxValue
控制台应用程序启动时。这是.NET上HTTP节流的常见但细微的原因。
(大概是LINQPad已经做了类似的事情)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句