gpt4 book ai didi

c# - 使用 Rx 缓存来自 Web 服务的结果并在 C# UWP 应用程序中本地使用

转载 作者:太空宇宙 更新时间:2023-11-03 12:06:15 25 4
gpt4 key购买 nike

我有一个 UWP 应用程序,我在其中调用 Web 服务以从服务器获取产品列表。

ItemWebService

public async Task<IObservable<ProductListItem>> GetProductlistAsync()
{
var productList = await _restClient.Get<IEnumerable<ProductListItem>>($"{_serviceUrl}/productlist");
return productList.ToObservable();
}

ProductListItem 类

public class ProductListItem
{
public int Id { get; set; }
public string SkuValue{ get; set; }
}

我想在特定时间段内缓存 productList(例如,假设 10 分钟)。每当调用 GetProductlistAsync() 时,它应该首先查看缓存,如果存在缓存列表则返回。

我尝试在 ItemWebService 中保留一个局部变量来缓存列表。但是每当用户导航到另一个页面时,该变量就会被清除。

注意:我将从我的 UWP 应用程序的不同页面调用此服务。因此,当用户导航到另一个页面时,代码不应清除缓存变量。

以下是我试过的代码。

private IObservable<ProductListItem> cachedProductList;

if (cachedProductList == null)
{
var dbProductList = await GetProductlistAsync();
var period = TimeSpan.FromSeconds(20);
var observable = Observable.Interval(period).Publish();
observable.Connect();
observable.Subscribe(async l =>
{
cachedProductList = await
GetProductlistAsync().ToObservable().Replay();
}
);
}

我想使用 Rx Extensions 来实现这一点。

最佳答案

像这样简单的东西行得通吗?

private static IEnumerable<ProductListItem> _productList = null;
public async Task<IObservable<ProductListItem>> GetProductlistAsync()
{

var productList = _productList;
if (productList == null)
{
_productList = await _restClient.Get<IEnumerable<ProductListItem>>($"{_serviceUrl}/productlist");
productList = _productList;
Observable.Timer(TimeSpan.FromHours(1.0)).Subscribe(x => _productList = null);
}
return productList.ToObservable();
}

关于c# - 使用 Rx 缓存来自 Web 服务的结果并在 C# UWP 应用程序中本地使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54820455/

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