【问题标题】:List of Tasks C#任务列表 C#
【发布时间】:2015-03-12 22:51:56
【问题描述】:
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()) 似乎不起作用,我的任务“状态”停留在“RanToCompletion”

我做错了什么?

【问题讨论】:

  • Task 指的是什么?财产还是阶级?我在其中找不到Run 方法

标签: c# arrays list task


【解决方案1】:

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 调用,因为最后一个值将用于所有方法调用...

【讨论】:

  • 我的任务列表的状态仍然是“RanToCompletion, Method = "{null}", 没有结果。
  • GetHouses 的返回类型 = List
【解决方案2】:

任务类型几乎没有问题。
在您的示例中,您使用的是 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&lt;List&lt;House&gt;&gt;,但第一段代码你明确指定了System.Threading.Tasks.Task

var tasks = new List<Task>();

你需要使用的是System.Threading.Tasks.Task&lt;TResult&gt;:

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

在类似情况下,我倾向于显式定义类型,以便代码更清晰易读,如您所见,甚至可以工作。

【讨论】:

    猜你喜欢
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 2021-03-28
    相关资源
    最近更新 更多