Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反应式扩展/UI缓存web请求数据_C#_Caching_System.reactive_Observable_Reactiveui - Fatal编程技术网

C# 反应式扩展/UI缓存web请求数据

C# 反应式扩展/UI缓存web请求数据,c#,caching,system.reactive,observable,reactiveui,C#,Caching,System.reactive,Observable,Reactiveui,我当前正在通过调用web服务获取视图模型中的数据: _loadDataCommand = ReactiveCommand.CreateFromObservable( () => Observable .StartAsync(ct => _getAllFunction(ct)) .TakeUntil(_loadDataCancel)); \u loadDataCancel只是一个作为取消信号的IObservable 目前

我当前正在通过调用web服务获取视图模型中的数据:

_loadDataCommand = ReactiveCommand.CreateFromObservable(
        () => Observable
            .StartAsync(ct => _getAllFunction(ct))
            .TakeUntil(_loadDataCancel));
\u loadDataCancel
只是一个作为取消信号的
IObservable

目前,我已经得到了它,这样当一个vm被导航到时,load data命令就会被执行

对于特别昂贵的获取操作,或者当用户只想导航并返回到他们留下视图的状态(例如列表中的选定项等)时,这是有问题的

我真正想做的是,让命令始终执行新的提取,但我想在nav to上使用一个额外的可观测值,这将:

  • 从缓存中检索数据(如果存在)
  • 如果数据不存在,则使用LoadData observable(并插入缓存)
  • 一些研究发现了一些粗略的信息,比如
    Memoize()
    MemoizeAll()
    但是,它们在rx中似乎不可用(但在System.Interactive中)

    在这里搜索,找到了这样的答案:,但是在查看了ReactiveUI的主源代码之后,现在我再也找不到
    ObservableSyncRucache

    有什么我遗漏的吗?我几乎可以肯定这会变得很琐碎,但我完全不知所措


    PS:我知道阿卡瓦什是存在的,但它对我的需求来说可能有点太重了。

    我觉得有几种方法可以实现这一点,这取决于更多的因素,但这基本上是你想要的吗

    IObservable<Object> GetFromServer()
    {
            //Get From Server
            //Store in Cache
    }
    IObservable<Object> GetFromCache()
    {
            return //returns something from cache or just return null;
    }
    ...
     GetFromCache()
     .SelectMany(result =>
      {
          if (result == null)
              return GetFromServer();
    
    
           return Observable.Return(result);
      });
    
     GetFromServer()
       .Replay(1);