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中自动更新加载的实体。
并不光彩的解决方案 - 但工程。
按顺序加载所有操作。前一次加载事件完成后,下次加载启动。
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
}
好运。
此解决方案可以正常工作,但如果您将多个服务调用一起排序,GUI中的等待时间将会变长。我希望有一个解决方案可以在不使用WaitHandles等的情况下等待两个并行操作。 – 2011-05-06 13:32:57
这与我自6月份以来一直在使用的Silverlight应用程序上使用的模式相同。它似乎对我很好。特别是,它充分利用了多线程后端服务器,因为每个实体请求都将在服务器上并行执行。
Rlodina建议按顺序加载实体,这也是有效的。我避免了这种情况,以利于并行操作的性能提升。但是,当时我被迫使用顺序操作的情况出现了。那种情况是当第二个查询需要受到第一个结果的约束时。
所以,在回答你的问题时要生硬,这种模式适合我。它功能和简单。我一直主张做最简单的事情,可能有用。
在完成的事件处理程序被绑定(如果它在下面的代码行中完成)之前,LoadOperation没有可能完成。所以你不必使用回调参数。 – 2014-01-04 19:26:30