C# 从异步任务中获取对象

C# get object from asyncron task

我刚刚开始使用 C# 进行线程编程。我真的不知道这是否是提出此类问题的正确社区。如果没有,我很抱歉。

我有两个函数,start() 和 status()。在 start() 中,我创建了一个新任务,例如:

start() {
   for each(dir => ListOfAllDirs) {
       new Task(() => { yr.LoadAllFiles(dir); }).Start();
   }
 }

所以我有大约 200 个并行任务 运行 此代码:

class yr
{
    List<Values> rv = new List<Values>();
    public List<Values> LoadAllFiles(string dir)
    {
       [...DoStuff...]
       rv.Add(...);
       rv.Add(...);
       rv.Add(...);
    }

}

所以我不知道如何访问 > 200 运行 线程以在数据完成之前获取数据。我在找某事喜欢:

status(dir) {
    int count = GetTaskByName[dir].rv.Count; (????)
    Console.WriteLine("Dir " + dir + "->" + count + "files checked");
}

最终输出:

Dir AA -> 19 files checkes
Dir AB -> 12 files checkes
Dir BB -> 49 files checkes
Dir AA -> 29 files checkes

所以要清楚:200 个目录,200 个任务,一切都是 运行 asyncron。如何访问特定任务/从 运行 任务获取数据。

您在找这样的东西吗?

var task = Task<List<values>>.Run((() => { return yr.LoadAllFiles(dir);}));
List<values> result = task.Result;

如果它有结果类型,您可以访问任务的结果。即等待任务完成并得到结果。

显然,您需要获取 200 个目录并为每个目录计算一个结果。 PLINQ 使这变得异常简单:

var results =
ListOfAllDirs
.AsParallel()
.Select(dir => new { dir, result = yr.LoadAllFiles(dir) })
.ToList();

这是你的目录列表加上计算结果。

您也可以通过任务手动完成。在那种情况下,您可能需要这样的序列:

  1. 创建所有任务并存储它们
  2. 使用Task.WaitAll等待完成
  3. 对每个任务使用Task.Result得到结果