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();
这是你的目录列表加上计算结果。
您也可以通过任务手动完成。在那种情况下,您可能需要这样的序列:
- 创建所有任务并存储它们
- 使用Task.WaitAll等待完成
- 对每个任务使用Task.Result得到结果
我刚刚开始使用 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();
这是你的目录列表加上计算结果。
您也可以通过任务手动完成。在那种情况下,您可能需要这样的序列:
- 创建所有任务并存储它们
- 使用Task.WaitAll等待完成
- 对每个任务使用Task.Result得到结果