Skip to content

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. マーブルダイアグラム

Yield のマーブルダイアグラム

購読すると、次のタイムステップで 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 2

5. 補足

NextFrame との違い

NextFrame はフレームベースの遅延(FrameProvider)で次のフレームに遅延します。Yield は時間ベースの遅延(TimeProvider)で次のタイムステップに遅延します。フレームの概念がない環境では Yield を、ゲームエンジンなどでは NextFrame を使用してください。

YieldFrame との違い

YieldFrameYield のフレームベース版です。YieldTimeProviderYieldFrameFrameProvider を使用します。