Dart Streamクラスtimeout()メソッド

Dar言語StreamクラスtoSet()メソッドDart

Dart Streamクラスのtimeout()メソッドについてメモ書き。

timeout()はStreamイベントのタイムアウトを制御するメソッド。
第1引数はタイムアウト値。Durationを使って値を指定する。
第2引数は名前付きオプション引数の「onTimeout:()」でタイムアウト発生時の処理を記述する。
onTimeout:()は引数としてEventSinkを受け取る。EventSinkはパイプの役割を果たし、EventSinkを使って受信したStreamイベントを制御する。
onTimeout:()を省略した場合、TimeoutExceptionが返される。
タイムアウトのカウントはリッスンを開始した時に始まる。
ブロードキャストを受け取った場合、返すStreamはブロードキャストとなる。ブロードキャストの場合は各リスナー毎に個別のタイマーを持つ。

コーディングで動作確認。
タイムアウト値は1秒で設定。i==5の時2秒待ちを発生させる。

void main() {
  final stream = () async* {
    for (int i = 0; i < 10; i++) {
      if (i == 5) {
        await Future.delayed(Duration(seconds: 2));
      }
      yield i;
    }
  }();
  stream.timeout(const Duration(seconds: 1)).listen(print);
}

実行結果。
onTimeout:()を指定していないので、TimeoutExceptionが返される。

0
1
2
3
4
Unhandled exception:
TimeoutException after 0:00:01.000000: No stream event

次にonTimeout:()でタイムアウト発生時の処理を記述する。

void main() {
  final stream = () async* {
    for (int i = 0; i < 10; i++) {
      if (i == 5) {
        await Future.delayed(Duration(seconds: 2));
      }
      yield i;
    }
  }();
  stream.timeout(
    const Duration(seconds: 1),
    onTimeout: (sink) {
      print("Timeout");
      // EventSinkのclose()メソッドでStreamを停止
      sink.close();
    },
  ).listen(print);
}

実行結果。
EventSinkのclose()メソッドを使いStreamを停止している。

0
1
2
3
4
Timeout

最後はEventSinkでStreamを制御しなかった場合の動作を確認。

void main() {
  final stream = () async* {
    for (int i = 0; i < 10; i++) {
      if (i == 5) {
        await Future.delayed(Duration(seconds: 2));
      }
      yield i;
    }
  }();
  stream.timeout(
    const Duration(seconds: 1),
    onTimeout: (sink) {
      print("Timeout");
    },
  ).listen(print);
}

実行結果。

0
1
2
3
4
Timeout
5
6
7
8
9

コメント

タイトルとURLをコピーしました