WCF RIA服务 – 加载多个实体

我正在寻找一种解决以下问题的模式,我认为这种模式很常见。

我正在使用WCF RIA Services在初始加载时将多个实体返回给客户端。 我希望两个实体都异步加载,以免锁定UI,我想利用RIA Services来做到这一点。

我的解决方案似乎在下面。 我会用这种方法遇到问题/限制吗? 这有更好的模式吗?

谢谢!


//create proxy to Domain Service var proxy = new RIAService.Web.DomainContext(); //call service; fire event when Presentation entities have been returned var loadPresentations = proxy.Load(proxy.GetPresentationsQuery()); loadPresentations.Completed += new EventHandler(loadPresentations_Completed); //call service; fire event when Topics entities have been returned var loadTopics = proxy.Load(proxy.GetTopicsQuery()); loadTopics.Completed += new EventHandler(loadTopics_Completed); void loadTopics_Completed(object sender, EventArgs e) { //bind topic entities to XAML } void loadPresentations_Completed(object sender, EventArgs e) { //bind presentation entities to XAML } 

您的解决方案应该按原样运行。 您的代码中有一个小问题 – 您在服务器上调用异步方法,然后绑定OnCompleted事件。 如果调用是超高速并且在事件绑定之前结束,则您将看不到实体。

根据我的经验,这从来就不是一个问题(在99.99%的情况下它工作正常),但只是为了拥有干净的代码,你可以在Load方法中提供回调,就像

 proxy.Load(proxy.GetPresentationsQuery(), op => { here work with op.Value }); 

提示:为了将实体加载到ObservableCollection中,我创建了从ObservableCollection派生的自定义类,它将DomainContext和DomainQuery作为参数放在ctor中,并且能够从服务器本身加载项目。 此外,可以在XAML中绑定集合,并在GUI中自动更新已加载的实体。

不是很好的解决方案 – 但有效。

按顺序加载所有操作。 上一次加载事件完成后,下一次加载启动。

 MyDomainContext proxy; public void Initialize() { //create proxy to Domain Service proxy = new RIAService.Web.DomainContext(); //load Presentation - LOAD STEP 1 Load(proxy.GetPresentationsQuery(), LoadPresentations_Completed, null); } void LoadPresentations_Completed(LoadOperation loadOp) { if (loadOp.HasError) { //process error here loadOp.MarkErrorAsHandled = true; } else { - LOAD STEP 2 var loadTopics = proxy.Load(proxy.GetTopicsQuery()); loadTopics.Completed += new EventHandler(loadTopics_Completed); } } void loadTopics_Completed(object sender, EventArgs e) { //bind presentation entities to XAML } 

祝好运。

这与我自6月以来一直在生产的Silverlight应用程序使用的模式相同。 它似乎对我有用。 特别是,它很好地利用了multithreading后端服务器,因为每个实体请求将在服务器上并行执行。

Rlodina建议按顺序加载实体也可以。 我避免这种做法有利于并行操作的性能提升。 但是,有一种情况我被迫使用顺序操作。 那种情况是第二个查询需要被第一个查询的结果约束。

所以,回答你的问题时,这种模式很适合我。 function简单。 我一直主张做最简单的事情。