我有這個程式,我用它來了解 Dart 的異步編程。
import 'dart:io';
Future<int> sumStream(Stream<int> stream) async {
var sum = 0;
await for (final value in stream) {
print('consuming event $value');
sum = value;
}
return sum;
}
Stream<int> countStream(int to) async* {
for (int i = 1; i <= to; i ) {
sleep(const Duration(milliseconds: 400));
print('publishing event $i');
yield i;
}
}
Future<void> main() async {
var stream = countStream(10);
var sum = sumStream(stream);
print('working...');
sleep(const Duration(milliseconds: 500));
print('working...');
sleep(const Duration(milliseconds: 500));
print('working...');
sleep(const Duration(milliseconds: 500));
print(await sum); // 55
}
輸出:
working...
working...
working...
publishing event 1
consuming event 1
publishing event 2
consuming event 2
publishing event 3
consuming event 3
publishing event 4
consuming event 4
publishing event 5
consuming event 5
publishing event 6
consuming event 6
publishing event 7
consuming event 7
publishing event 8
consuming event 8
publishing event 9
consuming event 9
publishing event 10
consuming event 10
55
在上面的代碼中,我選擇不立即await執行結果,sumStream()因為我想在sumStream()忙于從提供的流中消費事件時做一些額外的作業。所以我的期望是在sumStream()運行時會立即開始main()運行。我希望輸出看起來像下面的文字。我希望文本working...與出版商countStream()和消費者的其他印刷品交錯排列sumStream()。
working...
publishing event 1
consuming event 1
publishing event 2
consuming event 2
publishing event 3
consuming event 3
working...
publishing event 4
consuming event 4
publishing event 5
consuming event 5
publishing event 6
working...
consuming event 6
publishing event 7
consuming event 7
publishing event 8
consuming event 8
publishing event 9
consuming event 9
publishing event 10
consuming event 10
55
這是因為達特是單執行緒的,因此它不能運行main(),countStream()并sumStream()在同一時間?如果是這樣,我該如何更改我的程式,以便sumStream()與main()(使其成為多執行緒)并行運行?
uj5u.com熱心網友回復:
我很確定這是由于sleep功能。睡眠功能檔案:
小心使用它,因為當它在睡眠呼叫中被阻塞時,不能在隔離中處理異步操作。
我建議試試這個:
await Future.delayed(const Duration(milliseconds: 500));
這不會阻止所有其他異步操作的處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/374043.html
標籤:镖 async-await
