c# – MVVM和异步数据访问
作者:互联网
所以我有一个使用MVVM模式的WPF应用程序(Caliburn.Micro).我得到了视图和视图模型的连接,基本上缺少的是数据.数据将从WCF服务,本地存储或内存/缓存“按需”检索 – 原因是允许脱机模式并避免不必要的服务器通信.另一个要求是异步检索数据,因此不会阻止UI线程.
所以我想创建一些视图模型用来请求数据的“AssetManager”:
_someAssetManager.GetSomeSpecificAsset(assetId, OnGetSomeSpecificAssetCompleted)
请注意,它是异步调用.我遇到了一些不同的问题.如果不同的视图模型(大致)同时请求相同的资产,我们如何确保我们不做不必要的工作,并且他们都获得了我们可以绑定的相同对象?
不确定我是否采取了正确的方法.我一直在看一下Reactive Framework – 但我不知道如何在这种情况下使用它.关于我可以使用的框架/技术/模式的任何建议?这似乎是一种相当常见的情况.
解决方法:
Dictionary<int, IObservable<IAsset>> inflightRequests;
public IObservable<IAsset> GetSomeAsset(int id)
{
// People who ask for an inflight request just get the
// existing one
lock(inflightRequests) {
if inflightRequests.ContainsKey(id) {
return inflightRequests[id];
}
}
// Create a new IObservable and put in the dictionary
lock(inflightRequests) { inflightRequests[id] = ret; }
// Actually do the request and "play it" onto the Subject.
var ret = new AsyncSubject<IAsset>();
GetSomeAssetForReals(id, result => {
ret.OnNext(id);
ret.OnCompleted();
// We're not inflight anymore, remove the item
lock(inflightRequests) { inflightRequests.Remove(id); }
})
return ret;
}
标签:c,mvvm,wpf,system-reactive,caliburn-micro 来源: https://codeday.me/bug/20190613/1233666.html