更新添加了在任务列表中添加的缺失代码
我有一个任务清单,我等待着..
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!");
这是进程我的文件任务
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!");
那么等待什么任务呢?我的意思是,"All Done!"
在所有ProcessMyFileTask
完成后会来吗?还是在所有ValidateHexDumpsTask
也完成后?
当我测试它时,它出现在ValidateHexDumpsTask
之后,但我不确定是否总是如此,因为这可能是由于某些线程条件等。
只有在同时完成ProcessMyFiles
方法和ValidateHexDumps
时,它才会完成。
但是,不建议ContinueWith
。这是一个低级、危险的 API。您应该改用await
:
var files = Directory.GetFiles(myFilesDirectory);
var listOfTasks = files.Select(ProcessAndValidateAsync);
await Task.WhenAll(listOfTasks);
Console.WriteLine("All done!");
async Task ProcessAndValidateAsync(string file)
{
var list = await ProcessMyFileTask(localFile);
ValidateHexDumps(list, localFile);
}
WhenAll
将在ValidateHexDumps
完成对每个项目的运行时完成。
ContinueWith
返回一个Task
,该表示延续的完成,而不是作为延续的任务的完成。