更新 添加缺少的代码完成在任务列表等待任务在列表中与ContinueWith
我有任务的列表,我等待着上增加..
var files = Directory.GetFiles(myFilesDirectory);
var listOfTasks = new List<Tasks>();
files.ToList().ForEach(file => {
var localFile = file // to avoid any closure issue
listOfTasks.Add(ProcessMyFileTask(localFile));
});
await Task.WhenAll(listOfTasks.ToArray());
Console.WriteLine("All done!");
这里的ProcessMyFileTask
private async Task<List<string>> ProcessMyFileTask(string filePath)
{
using (var streamReader = File.OpenText(filePath))
{
string line;
if ((line = await streamReader.ReadLineAsync()) != null)
{
return DumpHexInLog(line);
}
return null;
}
}
处理所有文件时显示消息。但是,如果我添加延续任务,像这样..
var files = Directory.GetFiles(myFilesDirectory);
var listOfTasks = new List<Tasks>();
files.ToList().ForEach(file => {
var localFile = file // to avoid any closure issue
listOfTasks.Add(ProcessMyFileTask(localFile).ContinueWith(list =>
ValidateHexDumpsTask(list.Result, localFile)));
});
await Task.WhenAll(listOfTasks.ToArray());
Console.WriteLine("All done!");
然后会等待什么任务?我的意思是在所有的ProcessMyFileTask
完成后,会来吗?还是在所有ValidateHexDumpsTask
都完成之后呢?
当我测试它时,它出现在ValidateHexDumpsTask
之后,但我不确定这是否总是如此,因为这可能是由于某些线程条件或诸如此类。
第一点:你不需要'localFile = file'。在这种情况下'file'是lambda表达式的一个参数。它没有捕获任何其他东西。 –
接下来,不清楚你在哪里填充'listOfTasks'。当我们只能看到伪代码时,很难提供帮助。请改为提供[mcve]。 (当然,它们不一定是真正的文件 - 只是字符串可以......) –
这仍然是伪代码 - 由于forEach不是'ForEach',它不会编译。请再次提供[mcve]。 –