gpt4 book ai didi

c# - 尽快合并请求并出结果

转载 作者:行者123 更新时间:2023-11-30 21:40:51 25 4
gpt4 key购买 nike

简短版:如何实现 GetAndFetchLatest在我自己的代码中使用类似 Akavache 的方法 ( https://github.com/akavache/Akavache/blob/501b397d8c071366c3b6783aae3e98695b3d7442/src/Akavache/Portable/JsonSerializationMixin.cs#L202 ) - 就像不添加 Akavache 一样?

长版:我有一个从磁盘返回 T 列表的方法,我有一个返回相同类型的方法 List<T>来自 HTTP 服务。两者都将异步包装为 Task<List<T>>

在我的 View 模型中,我只想调用 1 个返回 Observable<List<T>> 的方法.

因此在我的 ViewModel 中我使用了 .Subscribe()更新 UI 的方法。本质上我需要被通知两次数据可用并且订阅中的代码也将完成两次。

此功能在 Akavache 中以 GetAndFetchLatest 的形式提供方法...但我对 RX 的理解还远远不够流利,无法理解如何通过我的 2 个数据方法调用自己实现它。

注意:所以我不想等待这两个任务!我想同时触发两者,一旦它们返回数据通知 Observable .

有什么建议吗?

最佳答案

给定Task<List<T>> GetFromWeb()Task<List<T>> GetFromDisk() ,简单的答案是:

var merged = Observable.Merge(
GetFromWeb().ToObservable(),
GetFromDisk().ToObservable()
);

//Same thing using extension syntax
var simply = GetFromWeb().ToObservable()
.Merge(GetFromDisk().ToObservable());

但是,这并不能处理 GetFromWeb 不太可能但可能发生的情况在 GetFromDisk 之前完成在这种情况下,我假设您想忽略 GetFromDisk 的结果.要处理这个问题,您将需要一些体操:

public IObservable<T> Prioritize<T>(params IObservable<T>[] orderedByDescendingPriority)
{
return orderedByDescendingPriority
.Select((o, i) => o.Select(item => Tuple.Create(orderedByDescendingPriority.Length - i, item)))
.Merge()
.Select(t => new Func<Tuple<int, T, bool>, Tuple<int, T, bool>>(t2 => Tuple.Create(Math.Max(t2.Item1, t.Item1), t.Item2, t.Item1 >= t2.Item1)))
.Scan(Tuple.Create(0, default(T), false), (t, f) => f(t))
.Where(t => t.Item3)
.Select(t => t.Item2);
}

var merged = Prioritize(
GetFromWeb().ToObservable(),
GetFromDisk().ToObservable()
);

编辑:

如果你总是想要GetFromDisk总是出现在GetFromWeb之前那么它就是一个简单的 Concat手术。这是可行的,因为 .NET 任务会在您引用它们的函数后立即自动启动:

    var t1 = GetFromDisk();
var t2 = GetFromWeb();

var merged = Observable.Concat(
t1.ToObservable(),
t2.ToObservable()
);

关于c# - 尽快合并请求并出结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44133100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com