代码在 LinqPad 中并行运行,但在控制台应用程序中却不能...为什么?
Code runs in parallel in LinqPad, but not in Console App...why?
我需要针对不同的日期范围对单个 Web 服务进行一系列调用,并生成一个串联的结果集。我想同时拨打电话以加快流程,尽管我在这方面的经验有限。
我尝试了几种技术,但根据执行时间,当我在 Visul Studio 控制台应用程序中 运行 时,我的代码调用继续按顺序 运行。我的意思是,如果一个月日期范围内的一次调用需要 15 秒,那么其中三个一个月的调用(据说 运行ning 并行)需要 45 秒。
但这是真正让我吃惊的部分:我开始 运行在 LinqPad 中使用完全相同的代码以便于调试。瞧,在 LinqPad 中,相同的代码并行执行 运行!通话3个月总共需要15秒左右!
现在我正在摸不着头脑,想知道这是怎么回事。我已经尝试将 LinqPad 版本复制到一个新的 conole 项目(以仔细检查两个版本中的所有内容是否真的相同),但它不会改变行为。
如果有任何建议,我将不胜感激。我不确定哪个代码与问题相关,但我在下面包含了调用 class 的 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 已经做了类似的事情)。
我需要针对不同的日期范围对单个 Web 服务进行一系列调用,并生成一个串联的结果集。我想同时拨打电话以加快流程,尽管我在这方面的经验有限。
我尝试了几种技术,但根据执行时间,当我在 Visul Studio 控制台应用程序中 运行 时,我的代码调用继续按顺序 运行。我的意思是,如果一个月日期范围内的一次调用需要 15 秒,那么其中三个一个月的调用(据说 运行ning 并行)需要 45 秒。
但这是真正让我吃惊的部分:我开始 运行在 LinqPad 中使用完全相同的代码以便于调试。瞧,在 LinqPad 中,相同的代码并行执行 运行!通话3个月总共需要15秒左右!
现在我正在摸不着头脑,想知道这是怎么回事。我已经尝试将 LinqPad 版本复制到一个新的 conole 项目(以仔细检查两个版本中的所有内容是否真的相同),但它不会改变行为。
如果有任何建议,我将不胜感激。我不确定哪个代码与问题相关,但我在下面包含了调用 class 的 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 已经做了类似的事情)。