var tasks = new List<Task>();
for (int i = 0; i < pageCount; i++)
{
var task = Task.Run(() =>
{
worker.GetHouses(currentPage);
});
tasks.Add(task);
currentPage++;
}
Task.WaitAll(tasks.ToArray());
我不明白。
每当我使用时:
var tasks = new[]
{
Task.Run(() => {worker.GetHouses(1);}),
Task.Run(() => {worker.GetHouses(2);}),
Task.Run(() => {worker.GetHouses(3);})
};
我循环通过那个数组,我得到的结果非常好。 (使用Task.WaitAll(tasks)
当我使用时:
var tasks = new List<Task>();
我的Task.WaitAll(tasks.toArray())
似乎无法正常工作,我的任务&#34;状态&#34;留在&#34; RanToCompletion&#34;
我做错了什么?
答案 0 :(得分:3)
currentPage
变量存在同步问题。还可以使用结果创建任务。
解决方案:
var tasks = new List<Task<List<House>>>();
for (int i = 0; i < pageCount; i++)
{
var currentPageCopy = currentPage;
var task = Task.Run(() =>
{
return worker.GetHouses(currentPageCopy);
});
tasks.Add(task);
currentPage++;
}
Task.WaitAll(tasks.ToArray());
您的代码存在的问题是,所有GetHouses
次调用都将使用currentPage + pageCount - 1
调用,因为最后一个值将用于所有方法调用...
答案 1 :(得分:0)
任务类型几乎没有问题
在您的示例中,您使用的是System.Threading.Tasks.Task
,但没有结果 - 它只是为了完成某项工作,例如void
方法。
在你的代码中:
var tasks = new[]
{
Task.Run(() => {worker.GetHouses(1);}),
Task.Run(() => {worker.GetHouses(2);}),
Task.Run(() => {worker.GetHouses(3);})
};
没有明确指定类型,因此结果是System.Threading.Tasks.Task<List<House>>
,但是您明确指定System.Threading.Tasks.Task
的第一段代码:
var tasks = new List<Task>();
您需要使用的是System.Threading.Tasks.Task<TResult>
:
var tasks = new List<Task<List<House>>>();// <- task type specified explicitly
for (int i = 0; i < pageCount; i++)
{
var task = Task.Factory.StartNew<List<House>>(() =>// <- task type specified explicitly , though it's mandatory here
{
return worker.GetHouses(currentPage);
});
tasks.Add(task);
currentPage++;
}
在类似情况下,我倾向于明确定义类型,以便代码变得更清晰,您可以看到,甚至可以工作。