我可以信任LoadOperation.Completed事件吗?

时间:2012-06-05 20:41:21

标签: c# silverlight asynchronous wcf-ria-services

假设我们有下面显示的代码,

LoadOperation lop=_dsrvX.Load(_dsrvX.GetUserDetails(userID));
lop.Completed +=(s,a)=>
{
  Debug.WriteLine("Completed but,
           First I load it then I registered Completed evet!");
}

我到处都看到这种类型的代码,所以我不知道是不是正确?

据我所知,当你调用domainService方法时,这会自动填充域服务对象的相关EntitySet。

假设LoadOperation(可以提交,调用操作)快速完成,当我传递到下一行我注册完成事件时,一切都已完成。是否可能?这似乎很难实现,但你能给我100%的保证吗?

如果你不能保证我会问是否有手动调用 OperationBase 对象的方法?

任何评论都将不胜感激。

2 个答案:

答案 0 :(得分:2)

嗯,这是一个疯狂的世界,我不会100%保证任何事情:P - 但我不认为这应该是一个问题。如果这困扰你,你可以将回调作为参数传递,如下所示:

_dsrvX.Load(_dsrvX.GetUserDetails(userID), userDetailsCallBack, null);

(...)

void userDetailsCallBack(LoadOperation<UserDetails> op)
{
   //do anything with the results
}

或者,为了进一步简化:

_dsrvX.Load(_dsrvX.GetUserDetails(userID), (op)=>
   {
       //do anything with the results  
   }, null);

答案 1 :(得分:1)

是的,你可以相信它 - 100%保证!

如果深入研究异步 Load方法背后的代码,您将看到它启动另一个线程,进行实际加载,然后立即返回。

然后,单独的线程准备服务调用,执行服务调用,最终返回结果数据。

它不会触发Completed事件,直到完成所有事情并且我们正在谈论“大量”代码才能通过,更不用说在Web服务上等待了,而在线程启动后返回几乎是瞬间的。即没有机会让另一个线程完成并中断它。

在下一行添加处理程序之前,加载完成的可能性为0%。

通常的方法是提供回调或匿名方法,但您现有的代码很好。 MS以这种方式设计时知道他们在做什么:)

我和Jon Skeet在一个相关的问题上有这个论点,他的反应是你不知道Load方法在做什么,所以它“可能”发生得比回归更快。 ..我务实的答案是,我们确切知道发生了什么,按设计,并且在负载开始之前100%返回