我有收到一个时期的web服务(ExternalWebService)(开始和结束日期)并返回所有日志此期间,我想为这项服务经过长时间的电话。问题在于,此服务只允许每个请求发送少量数据,而长时间意味着大量数据,这是导致错误的原因。因此,我决定循环遍历作为参数传递的期间的几个月,并使用任务并行调用此服务,并在任务执行结束时连接结果。下面是代码:如何运行使用相同外部变量的任务?
public List<object> GetList(DateTime start, DateTime end)
{
List<object> finalList = new List<object>();
object lockList = new object();
DateTime current = start;
List<Task> threads = new List<Task>();
do
{
current = new DateTime(Math.Min(current.AddMonths(1).Ticks, end.Ticks));
Task thread = Task.Run(() => {
List<object> partialList = ExternalWebService.GetListByPeriod(from: start, to: current);
lock (lockList)
{
finalList = finalList.Concat(partialList).ToList();
}
});
threads.Add(thread);
start = current;
}
while (current < end);
Task.WhenAll(threads).Wait();
return finalList;
}
此代码的工作,但有一个意想不到的结果,因为变量线程内使用前开始和当前变化。那么,我能做些什么来保证开始和目前内部使用的日期Task.Run具有相同的值,它们在创建线程时具有相同的值?
你的主要问题在这里是你设置'开始= current'而不等待'Task'你剥离出来,即不断变化的日期任务之前可以使用它们。 – JSteward
没错,但我不能等待任务,因为我需要开始下一个任务并继续循环。我只会等待最后的任务。 – Marcello
我跟着你,希望我的回答如下,让你朝着正确的方向前进。没有必要改变这些日期,你可以保留你需要的日期作为当地人。此外,答案中的方法也消除了不必要的锁定,因为它不会共享和变更列表。 – JSteward