使用并行度填充2个列表

问题描述 投票:0回答:3

我有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();

似乎没有任何反应,我想知道以后如何访问列表的内容(程序将继续执行)。谢谢!

c# task-parallel-library
3个回答
0
投票

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

0
投票

您可以使用关键字async将您的方法定义为异步方法:


0
投票

您应该await完成任务,

© www.soinside.com 2019 - 2024. All rights reserved.