【发布时间】:2020-02-11 13:52:20
【问题描述】:
我有 2 个长期运行的方法,它们从外部来源获取数据并将结果作为列表返回:
public static class Helper1
{
public static List<X> GetStuff()
{
// some long running stuff
}
}
public static class Helper2
{
public static List<Y> GetStuff()
{
// some long running stuff
}
}
我想并行而不是顺序运行它们。我的第一次尝试是:
var task1 = new Task>(() => Helper1.GetStuff()); var task2 = new Task>(() => Helper2.GetStuff());
var whenAllTask = Task.WhenAll(task1, task2);
task1.Start();
task2.Start();
似乎什么都没有发生,我想知道之后如何访问列表的内容(程序按顺序继续)。谢谢!
PS:
鉴于 Robin B 的回答,我现在正在使用以下代码:
var task1 = new Task<List<X>>(() => Helper1.GetStuff(), TaskCreationOptions.LongRunning);
var task2 = new Task<List<Y>>(() => Helper1.GetStuff(), TaskCreationOptions.LongRunning);
var whenAllTask = Task.WhenAll(task1, task2).Wait();
List<X> lst1 = task1.Result;
List<Y> lst2 = task2.Result;
不幸的是,没有任何反应,它似乎被卡住了。
PPS:
这似乎对我有用:
var task1 = Task.Factory.StartNew<List<X>>(() => Helper1.GetStuff(), TaskCreationOptions.LongRunning));
var task2 = Task.Factory.StartNew<List<Y>>(() => Helper2.GetStuff(), TaskCreationOptions.LongRunning);
var allTasks = new Task[] { task1, task2 };
Task.WaitAll(allTasks);
List<X> lst1 = task1.Result;
List<Y> lst2 = task2.Result;
【问题讨论】:
-
await whenAllTask;等待task1和task2完成 -
我还建议在创建时指定
TaskCreationOptions.LongRunning标志,这将强制创建一个单独的线程来运行任务。 -
t1和t2未定义。它们与这个问题有关吗?此外,task2的赋值不会编译,因为Helper1.GetStuff返回一个List<X>。示例请使用真实代码。 -
@cs0815 这是一个可以传递给
Task构造函数的标志(如果你正在使用它,也可以传递给TaskFactory.StartNew)。所以一个例子是var task1 = new Task<List<X>>(() => Helper1.GetStuff(), TaskCreationOptions.LongRunning); -
var task2 = new Task<List<Y>>(() => Helper1.GetStuff());- 这不应该是Helper2吗?