假设我们有下面显示的代码,
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 对象的方法?
任何评论都将不胜感激。
答案 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)
如果深入研究异步 Load
方法背后的代码,您将看到它启动另一个线程,进行实际加载,然后立即返回。
然后,单独的线程准备服务调用,执行服务调用,最终返回结果数据。
它不会触发Completed事件,直到完成所有事情并且我们正在谈论“大量”代码才能通过,更不用说在Web服务上等待了,而在线程启动后返回几乎是瞬间的。即没有机会让另一个线程完成并中断它。
在下一行添加处理程序之前,加载完成的可能性为0%。
通常的方法是提供回调或匿名方法,但您现有的代码很好。 MS以这种方式设计时知道他们在做什么:)
我和Jon Skeet在一个相关的问题上有这个论点,他的反应是你不知道Load
方法在做什么,所以它“可能”发生得比回归更快。 ..我务实的答案是,我们确切知道发生了什么,按设计,并且在负载开始之前100%返回