我们应该使用无扩展的可观测模式运行多个相关异步任务? [关闭]

问题描述 投票:0回答:1

我有一个关于设计我的跨平台解决方案(Xamarin.Forms和ASP.NET核心)的体系结构的一般问题。

我有多个调用API端点(类似于博客聚合应用程序)的要求,我想创建一个使用无功扩展或改装将由双方Xamarin.Forms和ASP.NET网站的核心消费共享REST API包装库。按无功扩展(Rx.NET)文件 - “(可观察)这种方法的优点是,当你有一大堆的任务不依赖于对方,你可以在同一时间开始他们所有,而不是等待对于每一个启动下一个”前完成。但在我的情况,我想启动多个API调用终端在后台,但要等到这意味着任务依赖这里全部完成。

是否有意义在这里使用Rx.NET的可观测模式作为我的观察者用户将不会收到从可观察的任何通知,直到所有任务完成了吗?有什么优点和缺点在这里,如果我使用任务并行库(与Task.WhenAll()),而不是Rx.NET的可观测考虑到我需要消耗它包括移动(X.F)和网络(ASP.NET核心)平台上。

.net asp.net-core xamarin.forms system.reactive reactiveui
1个回答
2
投票

RX是真棒为同时调用多个API终点。

你可以选择来处理每个结果,因为它到达或有查询捆绑的结果作为一个数组,并在年底返回他们。

让我们先从API调用,像这样的数组:

var api_calls = new Func<string>[]
{
    () => "Hello",
    () => "World",
};

这是返回字符串函数的琐碎阵列。

现在最简单的Rx查询如下所示:

IObservable<string> query1 =
    from f in api_calls.ToObservable()
    from r in Observable.Start(() => f())
    select r;

当您订阅这个查询,你得到一个值在其中调用返回的顺序(而不是在它们被要求的顺序)的时间。

你可以这样写这样的查询,而不是:

IObservable<string> query1 =
    api_calls
        .ToObservable()
        .SelectMany(f =>
            Observable
                .Start(() => f()));

写此查询方式允许我们做一些事情。

如果我想返回所有的结果在最后,我只是这样做:

IObservable<string[]> query2 =
    api_calls.ToObservable()
        .SelectMany(f => Observable.Start(() => f()))
        .ToArray();

现在,我得到一个可观察仍然同时查询,但只返回一个string[]作为其唯一的价值。

现在的问题是,它可能是坏了。要恢复秩序(如果您希望有结果的匹配,你可以做到这一点的Func<string>[]源的原始顺序:

IObservable<string[]> query =
    api_calls
        .ToObservable()
        .SelectMany((f, i) =>
            Observable
                .Start(() => (i, f())))
        .ToArray()
        .Select(xs =>
            xs
                .OrderBy(x => x.Item1)
                .Select(x => x.Item2)
                .ToArray());

运行查询我得到{ "Hello", "World" }的数组,顺序,每一次我订阅。

© www.soinside.com 2019 - 2024. All rights reserved.