Skip to content

FromAsync

1. 概要

FromAsync は、非同期ファクトリ関数から Observable を生成するファクトリメソッドです。ファクトリ関数は CancellationToken を受け取り、ValueTask または ValueTask<T> を返します。

購読時に非同期処理が開始され、完了すると結果が発行されます。購読が解除されると CancellationToken を通じて処理のキャンセルが通知されます。

2. シグネチャ

Unit(戻り値なし)

csharp
public static Observable<Unit> FromAsync(Func<CancellationToken, ValueTask> asyncFactory, bool configureAwait = true)

戻り値のない非同期処理を実行し、完了時に Unit を発行します。

csharp
Observable.FromAsync(async ct => await DoWorkAsync(ct))

T(戻り値あり)

csharp
public static Observable<T> FromAsync<T>(Func<CancellationToken, ValueTask<T>> asyncFactory, bool configureAwait = true)

戻り値のある非同期処理を実行し、結果を発行して完了します。

csharp
Observable.FromAsync(async ct => await FetchDataAsync(ct))

パラメータ

パラメータ説明
asyncFactory購読時に呼び出される非同期ファクトリ関数。CancellationToken を受け取る
configureAwaittrue(既定値)の場合、ConfigureAwait(true) で継続する。false にするとコンテキストキャプチャを抑制する

3. マーブルダイアグラム

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

購読時に非同期処理が開始され、処理が完了すると結果の値を 1 つ発行し、直後に完了通知を送ります。

4. サンプルコード

csharp
using R3;
using System.Net.Http;

// === HTTP リクエストの結果を Observable にする ===
var httpClient = new HttpClient();

Observable.FromAsync<string>(async ct =>
    {
        var response = await httpClient.GetAsync("https://api.example.com/data", ct);
        return await response.Content.ReadAsStringAsync(ct);
    })
    .Subscribe(
        body => Console.WriteLine($"レスポンス: {body}"),
        _ => Console.WriteLine("完了"));
// 出力例: レスポンス: {"id":1,"name":"example"}
// 出力: 完了

// === 戻り値なしの非同期処理 ===
Observable.FromAsync(async ct =>
    {
        await Task.Delay(1000, ct);
        Console.WriteLine("非同期処理が完了しました");
    })
    .Subscribe(
        _ => Console.WriteLine("通知を受信"),
        _ => Console.WriteLine("完了"));
// 出力(1 秒後): 非同期処理が完了しました
// 出力: 通知を受信
// 出力: 完了

// === configureAwait を使う例 ===
Observable.FromAsync<int>(async ct =>
    {
        // UI スレッドのキャプチャを抑制
        await Task.Delay(500, ct);
        return 42;
    }, configureAwait: false)
    .Subscribe(x => Console.WriteLine($"値: {x}"));

5. 補足

Create との違い

CreateObserver<T> を直接操作するため、複数の値の発行やエラーハンドリングなど、より細かい制御が可能です。単一の非同期結果を発行するだけなら FromAsync のほうが簡潔です。

ToObservable との違い

ToObservable は既に開始済みの Task / ValueTask を変換します。一方、FromAsync は購読時にファクトリ関数を呼び出して非同期処理を遅延実行します。また、FromAsyncCancellationToken を提供するため、購読解除時のキャンセルが可能です。