Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF RIA服务-加载多个实体_C#_Wcf_Linq To Entities_Ria - Fatal编程技术网

C# WCF RIA服务-加载多个实体

C# WCF RIA服务-加载多个实体,c#,wcf,linq-to-entities,ria,C#,Wcf,Linq To Entities,Ria,我正在寻找一种模式来解决以下问题,我认为这是常见的 我使用WCF RIA服务在初始加载时将多个实体返回到客户端。我希望两个实体都异步加载,以免锁定UI,我希望利用RIA服务来实现这一点 下面我的解决方案似乎有效。这种方法是否会遇到问题/限制?有更好的模式吗 谢谢 不是绝妙的解决方案,但有效 按顺序加载所有操作。下一次加载在上一次加载事件完成时开始 MyDomainContext proxy; public void Initialize() { //create proxy to D

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

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

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

谢谢



不是绝妙的解决方案,但有效

按顺序加载所有操作。下一次加载在上一次加载事件完成时开始

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      
}
MyDomainContext代理;
公共无效初始化()
{
//创建代理到域服务
proxy=new.service.Web.DomainContext();
//加载演示-加载步骤1
Load(proxy.GetPresentationsQuery(),LoadPresentations\u已完成,null);
}
无效加载演示文稿\u已完成(加载操作加载操作)
{
if(loadOp.hasrerror)
{
//这里的进程错误
loadOp.MarkErrorAsHandled=true;
}
其他的
{
-加载步骤2
var loadTopics=proxy.Load(proxy.GetTopicsQuery());
loadTopics.Completed+=新事件处理程序(loadTopics\u Completed);
}
}
void loadTopics\u已完成(对象发送方,事件参数e)
{
//将表示实体绑定到XAML
}

祝你好运。

这是我在Silverlight应用程序上使用的相同模式,该应用程序自6月份开始生产。它似乎对我很管用。特别是,它很好地利用了多线程后端服务器,因为每个实体请求都将在服务器上并行执行

Rlodina建议按顺序加载实体,这同样有效。为了提高并行操作的性能,我避免了这种情况。但是,有一次我被迫使用顺序操作。在这种情况下,第二个查询需要受到第一个查询结果的约束


所以,坦率地回答你的问题,这个模式对我很有效。它功能简单。我一直主张做可能有效的最简单的事情。

你的解决方案应该按原样工作。您的代码中有一个小陷阱——您正在服务器上调用异步方法,然后绑定OnCompleted事件。如果调用是超快速的,并且在绑定事件之前结束,则不会看到实体

根据我的经验,这从来都不是一个问题(在99.99%的情况下,它工作得很好),但只要有干净的代码,就可以在Load方法中提供回调,如

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

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

此解决方案可行,但如果将多个服务调用排序在一起,GUI中的等待时间将更长。我希望有一种解决方案,可以在不使用WaitHandles等的情况下等待两个并行操作。如果LoadOperation是在下面的代码行中完成的,则LoadOperation不可能在绑定完成的eventhandler之前完成。因此,您不必使用回调参数。
proxy.Load(proxy.GetPresentationsQuery(), op => { here work with op.Value });