Yield
1. 概要
Yield は、次のタイムステップ(スケジューラティック)で Unit を 1 つ発行して完了するファクトリメソッドです。TimeProvider を介して処理を非同期的に次の時間スロットに遅延させます。
フレームの概念がない環境(サーバーサイド、コンソールアプリなど)で、同期的な発行を避けて次のスケジューラティックまで遅延させたい場合に使用します。
2. シグネチャ
基本
csharp
public static Observable<Unit> Yield(CancellationToken cancellationToken = default)デフォルトの TimeProvider を使用して、次のタイムステップで Unit を発行し完了します。
csharp
Observable.Yield()TimeProvider 指定
csharp
public static Observable<Unit> Yield(TimeProvider timeProvider, CancellationToken cancellationToken = default)使用する TimeProvider を明示的に指定するオーバーロードです。
csharp
Observable.Yield(TimeProvider.System)オーバーロードの使い分け
| overload | 使う場面 |
|---|---|
Yield() | デフォルトの TimeProvider で次のタイムステップに遅延する |
Yield(TimeProvider) | カスタム TimeProvider を使用する |
3. マーブルダイアグラム
購読すると、次のタイムステップで Unit を 1 つ発行し、直後に完了通知を送ります。
4. サンプルコード
csharp
using R3;
// 次のタイムステップで 1 回だけ発行
Observable.Yield()
.Subscribe(
_ => Console.WriteLine("次のタイムステップで実行"),
_ => Console.WriteLine("完了"));
// 出力(次のタイムステップ): 次のタイムステップで実行
// 出力: 完了
// TimeProvider を指定
Observable.Yield(TimeProvider.System)
.Subscribe(_ => Console.WriteLine("非同期で実行"));
// Concat で順次遅延を挿入
Observable.Yield()
.Select(_ => "step 1")
.Concat(Observable.Yield().Select(_ => "step 2"))
.Subscribe(x => Console.WriteLine(x));
// 出力:
// step 1
// step 25. 補足
NextFrame との違い
NextFrame はフレームベースの遅延(FrameProvider)で次のフレームに遅延します。Yield は時間ベースの遅延(TimeProvider)で次のタイムステップに遅延します。フレームの概念がない環境では Yield を、ゲームエンジンなどでは NextFrame を使用してください。
YieldFrame との違い
YieldFrame は Yield のフレームベース版です。Yield は TimeProvider、YieldFrame は FrameProvider を使用します。