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

标签 c# 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 个任务,一切都在异步运行。如何访问特定任务/从正在运行的任务中获取数据。

最佳答案

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

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

还有你的目录列表和计算结果。

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

  1. 创建所有任务并存储它们
  2. 使用 Task.WaitAll 等待完成
  3. 在每个任务上使用 Task.Result 来获取结果

关于C# 从异步任务中获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30835280/

相关文章:

c# - 图表工具在 Visual Studio 中显示为灰色

multithreading - Delphi 7 的线程框架 - 有吗?

c# - 如何让 ActionBlock 在发生任何异常时运行

c# - TaskFactory,结束时开始一个新任务

c# - 在页面加载时将数据传递给 JavaScript

c# - 将数据从 Oracle Server 复制到 SQL Server

c# - SqlCommand.Parameters.AddWithValue 未返回正确结果

c# - WinUSB_Initialize 函数出现 INVALID_FUNCTION (0x1) 错误

C# Task.ContinueWith 问题

c# - 你能多次调用一个任务的 Wait() 吗?