我无法理解以下代码的流程。 该代码应处理MERGE_SIZE行(此运行中为3行),将这些行保存到“阶段”文件中,然后处理接下来的3行,依此类推。
对savePhase的调用正在等待,因此我期望在处理其他行之前完成savePhase。
正如您在输出中看到的,每行下面都是进程,然后savePhase调用完成。
Future _sort() async {
var completer = Completer<void>();
var instance = 0;
var lineCount = MERGE_SIZE;
var phaseDirectory = Directory.systemTemp.createTempSync();
var list = <String>[];
var sentToPhase = false;
await File(filename)
.openRead()
.map(utf8.decode)
.transform(LineSplitter())
.forEach((l) async {
list.add(l);
print('$l linecount:$lineCount');
lineCount--;
if (lineCount == 0) {
lineCount = MERGE_SIZE;
instance++;
sentToPhase = true;
await savePhase(phaseDirectory, 1, instance, list, lineDelimiter);
list.clear();
print('savePhase completed');
}
});
输出
9 line linecount:3
8 line linecount:2
7 line linecount:1
6 line linecount:3
5 line linecount:2
4 line linecount:1
3 line linecount:3
2 line linecount:2
1 line linecount:1
savePhase completed
savePhase completed
savePhase completed
这与openRead用于传递读取行的流有关吗?
我以为我已经想通了,但显然不是:)
答案 0 :(得分:0)
未测试您的程序,但我可以确定您的问题是您希望forEach()方法在下一次调用之前等待每个Future
完成,但情况并非如此。
尝试看一下以下解决方案,这些解决方案几乎都是相同的问题: Sequential processing of a variable number of async functions in Dart