簡體   English   中英

轉換`IObservable<T> ` 到 `IEnumerable <Task<T> &gt;`?

[英]Convert `IObservable<T>` to `IEnumerable<Task<T>>`?

我有幾個異步 API,它們使用回調或事件而不是async 我成功地使用TaskCompletionSource來包裝它們, 如下所述

現在,我想使用一個返回IObservable<T>並產生多個對象的 API。 我讀過 Rx for .NET,這似乎是要走的路。 但是,我對包含另一個依賴項和另一個新范式猶豫不決,因為我已經在這個應用程序中使用了很多對我來說是新的東西(比如 XAML、MVVM、C# 的 async/await)。

有什么方法可以像包裝單個回調 API 一樣包裝IObservable<T>嗎? 我想這樣調用 API:

foreach (var t in GetMultipleInstancesAsync()) {
    var res = await t;
    Console.WriteLine("Received item:", res);
}

如果 observable 發出多個值,您可以將它們轉換為Task<T> ,然后將它們添加到任何IEnumerable結構中。

檢查IObservable ToTask 正如此處所討論的,observable 必須在等待之前完成,否則可能會出現更多值。

此處的本指南也可能對您有用

public static Task<IList<T>> BufferAllAsync<T>(this IObservable<T> observable)
{
    List<T> result = new List<T>();
    object gate = new object();
    TaskCompletionSource<IList<T>> finalTask = new TaskCompletionSource<IList<T>>();

    observable.Subscribe(
        value =>
        {
            lock (gate)
            {
                result.Add(value);
            }
        },
        exception => finalTask.TrySetException(exception),
        () => finalTask.SetResult(result.AsReadOnly())
    );

    return finalTask.Task;
}

如果您想使用 Rx,那么您可以使用您的返回列表:

GetMultipleInstancesAsync().ToObservable().Subscribe(...);

您可以訂閱 OnCompleted/OnError 處理程序。

你也可以把它包裝成一個任務列表:

var result = await Task.WhenAll(GetMultipleInstancesAsync().ToArray());

所以你得到了一系列你的結果,你就完成了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM