我有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<List<X>>(() => Helper1.GetStuff());
var task2 = new Task<List<Y>>(() => Helper1.GetStuff());
var whenAllTask = Task.WhenAll(t1, t2);
task1.Start();
task2.Start();
似乎没有任何反应,我想知道以后如何访问列表的内容(程序将继续执行)。谢谢!
WhenAll
将等待所有给定的running任务。因此,您必须先启动它们。另外,如果您使用Task<T>
,则可以通过读取Task<T>.Result
属性来检索任务完成后的结果。
您还将注意到,Task.WhenAll
将返回一个等待项。因此,您将不得不在那儿打电话给Wait()
,否则您将开除并忘记。
这里是一个例子:
class Program
{
static void Main()
{
Task<List<int>> t1 = new Task<List<int>>(GetList);
Task<List<int>> t2 = new Task<List<int>>(GetList);
t1.Start();
t2.Start();
Task.WhenAll(t1, t2).Wait();
Console.WriteLine("Both should have ended now");
List<int> lst1 = t1.Result;
List<int> lst2 = t2.Result;
Console.ReadKey(true);
}
public static List<int> GetList()
{
Console.WriteLine("Started");
Random rng = new Random();
List<int> lst = new List<int>();
for(int i = 0; i < 1000000; i++)
{
lst.Add(rng.Next());
}
Console.WriteLine("Ended");
return lst;
}
}
您可以使用关键字async
将您的方法定义为异步方法:
您应该await
完成任务,