使用“继续”在列表中等待任务完成



更新添加了在任务列表中添加的缺失代码

有一个任务清单,我等待着..

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,该表示延续的完成,而不是作为延续的任务的完成。

最新更新