我刚刚开始使用 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();
还有你的目录列表和计算结果。
您也可以通过任务手动完成。在那种情况下,您可能需要这样的序列:
- 创建所有任务并存储它们
- 使用 Task.WaitAll 等待完成
- 在每个任务上使用 Task.Result 来获取结果
关于C# 从异步任务中获取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30835280/