首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否将`IObservable<T>`转换为`IEnumerable<Task<T>>`?

是否将`IObservable<T>`转换为`IEnumerable<Task<T>>`?
EN

Stack Overflow用户
提问于 2019-12-29 17:47:59
回答 2查看 231关注 0票数 1

我有几个异步API,它们使用回调或事件而不是async。我成功地使用TaskCompletionSource对它们进行了as described here包装。

现在,我想使用一个返回IObservable<T>并产生多个对象的接口。我读到了关于.NET的Rx,这似乎是一条可行的道路。然而,我在犹豫是否要包含另一个依赖项和另一个新的范式,因为我已经在这个应用程序中使用了很多对我来说都很新的东西(比如XAML、MVVM、C#的async/await)。

有没有类似于包装单个回调IObservable<T>的方法来包装API?我想这样调用API:

代码语言:javascript
运行
复制
foreach (var t in GetMultipleInstancesAsync()) {
    var res = await t;
    Console.WriteLine("Received item:", res);
}
EN

回答 2

Stack Overflow用户

发布于 2019-12-29 18:11:37

如果可观察对象发出多个值,则可以将它们转换为Task<T>,然后将它们添加到任何IEnumerable结构中。

检查IObservable ToTask。正如这里所讨论的,可观察对象必须在等待之前完成,否则可能会有更多的值。

This guide here might do the trick for you too

代码语言:javascript
运行
复制
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;
}
票数 0
EN

Stack Overflow用户

发布于 2019-12-29 18:14:33

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

代码语言:javascript
运行
复制
GetMultipleInstancesAsync().ToObservable().Subscribe(...);

您可以订阅OnCompleted/OnError处理程序。

你也可以把它包装成一个任务列表:

代码语言:javascript
运行
复制
var result = await Task.WhenAll(GetMultipleInstancesAsync().ToArray());

所以你得到了一个结果数组,你就完成了。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59518323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档