执行并行任务 -> 等待所有任务完成 -> 利用结果

3

GetSystems()GetActions()都返回不同类型的IEnumerable<T>。我需要做什么才能访问下面的结果?我需要使用Task.WaitAll()或类似的东西吗?

Task t1 = new Task(() => GetSystems());
Task t2 = new Task(() => GetActions());

List<Task> tasks = new List<Task>() { t1, t2 };

Parallel.ForEach(tasks, t =>
                          {
                              t.Start();
                          });

//t1.Result...?

我正在使用C# 4.0。

更新:

private Task<List<SYSTEM>> GetSystems()
{
    return Task.Factory.StartNew(() =>
    {
        using (var context = new DbContext())
        {
            return context.SYSTEM.ToList();
        }
    });
}

3
Task 没有 Result 属性,而 Task<T> 则有。我们不知道 GetSystemsGetActions 的具体作用,但几乎可以确定你需要某种形式的 Task<T> - Jon Skeet
@JonSkeet 好的,我已经更新了其中一种方法的当前状态。您能否告诉我如何使其返回所需的类型? - Johan
听起来你想要 Task<IEnumerable<AS_SYSTEM>> t1 = new Task(() => GetSystems());。然而,你几乎肯定想要返回 context.SYSTEM.ToList()` 否则它对你没有用... - Jon Skeet
@JonSkeet 谢谢,你对我更新的代码片段有任何异议吗? - Johan
@JonSkeet 好的,谢谢。请把它作为答案发布,这样我可以给你声望值:) - Johan
我并不清楚这是否回答了你实际的问题,但是嘿... - Jon Skeet
1个回答

4

您需要使用Task<T>才能使用Result属性。根据评论,看起来您想要:

Task<List<SYSTEM>> t1 = ...;
Task<List<ACTION>> t2 = ...;

Task[] tasks = { t1, t2 };

Parallel.ForEach(tasks, t => t.Start());

Task.WaitAll(tasks);

List<SYSTEM> systems = t1.Result;
List<ACTION> actions = t2.Result;

不过,您应该考虑如何处理失败情况。


然后执行 tasks.ToArray() :) - Jens Kloster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接