任务列表C#

时间:2015-03-12 22:51:57

标签: c# arrays list task

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;

我做错了什么?

2 个答案:

答案 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++;
}

在类似情况下,我倾向于明确定义类型,以便代码变得更清晰,您可以看到,甚至可以工作。