WCF RIA Services - 加载多个实体

WCF RIA Services - 加载多个实体

问题描述:

我正在寻找一种模式来解决以下问题,我认为这很常见。WCF RIA Services - 加载多个实体

我使用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%的情况下能正常工作),但只是有干净的代码,就可以提供负载方法中的回调,像

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

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

+0

在完成的事件处理程序被绑定(如果它在下面的代码行中完成)之前,LoadOperation没有可能完成。所以你不必使用回调参数。 – 2014-01-04 19:26:30

并不光彩的解决方案 - 但工程。

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

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<PresentationEntity> 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  
} 

好运。

+0

此解决方案可以正常工作,但如果您将多个服务调用一起排序,GUI中的等待时间将会变长。我希望有一个解决方案可以在不使用WaitHandles等的情况下等待两个并行操作。 – 2011-05-06 13:32:57

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

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

所以,在回答你的问题时要生硬,这种模式适合我。它功能和简单。我一直主张做最简单的事情,可能有用。