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());