Caching 当使用任务作为可观察的重试时,如何缓存任务的结果?

Caching 当使用任务作为可观察的重试时,如何缓存任务的结果?,caching,task,system.reactive,reactive-programming,Caching,Task,System.reactive,Reactive Programming,这就是我所拥有的: CitiesObservable = Observable .FromAsync(apiClient.GetCitiesTask) .Retry(); apiClient.getCitieTask返回类型为:task 问题是每次我向可观察对象添加订户时,都会再次调用apiClient.GetCitiesTask。成功完成后,如何缓存结果 谢谢 重新编写的问题 我希望apiClient.GetCiti

这就是我所拥有的:

CitiesObservable = Observable
                   .FromAsync(apiClient.GetCitiesTask)
                   .Retry();
apiClient.getCitieTask
返回类型为:
task

问题是每次我向可观察对象添加订户时,都会再次调用apiClient.GetCitiesTask。成功完成后,如何缓存结果

谢谢

重新编写的问题

我希望apiClient.GetCitiesTask能够根据需要被多次调用(直到不会失败),但一旦调用成功,所有迟到的订阅者都应该使用缓存结果

结论

出现了两个解决方案,一个是我找到的,另一个是我选择的答案

解决方案A:(实际上几乎就是一个解决方案)

解决方案B:(作者@Bluesman)

CitiesObservable=Observable.StartAsync(
()=>Observable.fromsync(apiClient.GetPlacesTask.Retry().ToTask())
);
//然后你可以订阅你想要的。
那么

Observable
    .StartAsync(() => Observable
        .FromAsync(reserbusAPI.GetPlacesTask<City>)
        .Retry()
        .ToTask());
可观察
.StartAsync(()=>可观测
.fromsync(reserbusAPI.GetPlacesTask)
.重试()
.ToTask());

外部的
StartAsync
确保所创建任务的最终结果得到缓冲,而内部的
fromsync
Retry
确保根据需要多次调用
GetPlacesTask
。然而,整个重试过程甚至在第一次订阅之前就开始了。

只要延迟订阅的用户得到缓存结果,我就会看到它;我不需要懒惰。我会在大约一个小时内检查。事实上,我认为您需要
PublishLast
,因为它会将缓存的结果重放给新的观察者。而且您不一定需要使用
连接
;您可以改为使用
RefCount
选择器
重载(在大多数情况下,后者更可取)。@DaveSexton在使用任务时,PublishLast或Publish不会有什么区别,是吗?(只有一个结果)。你能举例说明如何使用RefCount或selector吗?你自己试试。收到通知后,在您的
Publish
ed observable上再次调用
Subscribe
。现在,您是否再次观察到缓存通知?只需将
Connect()
替换为
RefCount()
,但要注意其实际行为。
选择器
重载在这种情况下可能不合适,但这完全取决于您在连接后对可观察对象所做的操作。@DaveSexton,你说得对,我在延迟订阅服务器上收到onCompleted,但没有值。我用RefCount()替换了Connect,但没有按预期工作。我将只剩下另一个解决方案作为正确的解决方案。
CitiesObservable = Observable.StartAsync(
   () => Observable.FromAsync(apiClient.GetPlacesTask<City>).Retry().ToTask()
);
// Then you can subscribe as you want.
Observable
    .StartAsync(() => Observable
        .FromAsync(reserbusAPI.GetPlacesTask<City>)
        .Retry()
        .ToTask());