C#从asyncron任务获取对象

C#从asyncron任务获取对象,c#,task,C#,Task,我刚开始用c#进行线程编程。我真的不知道这个社区是否适合问这样的问题。如果没有,我很抱歉 我有两个函数,start()和status()。在start()中,我创建了一个新任务,如: start() { for each(dir => ListOfAllDirs) { new Task(() => { yr.LoadAllFiles(dir); }).Start(); } } 因此,我有大约200个并行任务使用此代码运行: class yr {

我刚开始用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(...);
    }

}
最后的结果是:

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

所以要明确的是:200个目录,200个任务,所有的东西都在异步运行。如何访问特定任务/从正在运行的任务中获取数据。

您正在寻找类似的内容吗

var task = Task<List<values>>.Run((() => { return yr.LoadAllFiles(dir);}));
List<values> result = task.Result;
var task=task.Run((()=>{return yr.LoadAllFiles(dir);}));
列表结果=任务。结果;

如果它具有结果类型,则可以访问任务的结果。这将等待任务完成并获得结果。

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

var results =
ListOfAllDirs
.AsParallel()
.Select(dir => new { dir, result = yr.LoadAllFiles(dir) })
.ToList();
这是你的目录列表和计算结果

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

  • 创建所有任务并存储它们
  • 使用Task.WaitAll等待完成
  • 对每个任务使用Task.Result来获得结果

  • 问题是什么?如何通过运行asycron任务访问对象?这个问题非常模糊。你自己从头读到底。如果不是你,你能理解吗?我甚至不知道现在该具体问什么。你必须想办法解决这个问题。对不起,现在更好吗?更好,答案现在是可能的。好的,谢谢。这很有帮助。可以获取未完成任务的临时结果。因此,我可以每2秒检查一次,得到的结果是:“到目前为止,在Dir AA中找到了33个文件”[…]“到目前为止,在Dir AA中找到了44个文件”我可能会让任务本身报告进度。您可以让他们在取得某些进展时更新UI。或者,您可以遍历任务列表并检查它们的
    状态
    ,以查看它们是否已完成。
    var results =
    ListOfAllDirs
    .AsParallel()
    .Select(dir => new { dir, result = yr.LoadAllFiles(dir) })
    .ToList();