0

假设我们有如下所示的代码,

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(Can be Submit,Invoke ops.) 快速完成,当我传递到下一行注册完成事件时,一切都完成了。这可能吗?这似乎很难实现,但你能给我 100% 的保证吗?

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

任何评论将不胜感激。

4

2 回答 2

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);
于 2012-06-05T21:48:07.813 回答
1

是的,您可以信任它 - 100% 保证!

如果您深入研究异步 Load方法背后的代码,您会发现它启动了另一个线程来执行实际加载,然后立即返回。

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

在这一切完成之前,它无法触发 Completed 事件,并且我们正在谈论“很多”代码要通过,更不用说在 Web 服务上等待,而在线程启动后返回几乎是瞬时的。即其他线程没有机会完成并中断它。

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

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

在一个相关问题上,我与 Jon Skeet 有过争论,他的反应是你不知道该Load方法在做什么,因此它“可能”比返回更快发生......我务实的回答是我们确切地知道什么正在按照设计进行,并且在负载开始之前它 100% 返回

于 2012-06-06T10:20:32.893 回答