我有下面的代码,它基本上是在 SilverLight 应用程序中调用域服务。
LoadOperation<tCity> loadOperation = _dataContext.Load(query,callBack, true);
你能告诉我先做哪个手术吗?
callBack 方法是在分配 loadOperation 变量之前调用还是在分配之后调用?
谢谢
我有下面的代码,它基本上是在 SilverLight 应用程序中调用域服务。
LoadOperation<tCity> loadOperation = _dataContext.Load(query,callBack, true);
你能告诉我先做哪个手术吗?
callBack 方法是在分配 loadOperation 变量之前调用还是在分配之后调用?
谢谢
假设它是一个异步操作,理论上它可能以任何一种方式发生。异步操作应该发生在另一个线程中,如果在返回之前完成Load
,则可以在分配完成之前调用回调。
在实践中,我希望异步调用比方法结束时的任何内务处理花费的时间要长得多——Load
但我也不会将这个假设放入代码中。除非有明确的同步来确保分配发生在回调之前,否则我认为依赖它不是一个好主意。
即使此时分配总是首先发生,请考虑:
编辑:我一直在思考这个问题,并试图找出我的直觉背后的原因,即你不应该做出这个假设,即使它在现实中几乎总是会好的。
依赖操作顺序是违背异步精神的。
你应该(IMO)开始做一些事情,并随时准备好让它回来。这就是你应该考虑的方式。一旦你开始走下“我确信在返回响应之前我可以做一些工作”的滑坡,你最终会进入一个充满不确定性的世界。
这个非常具体的 RIA 服务问题有 3 个可能的答案:
案例 1: 根据 .Net Reflector 对相关实际加载方法的调查,在返回发生之前调用回调似乎是不可能的。(如果有人想争辩说欢迎他们解释旋转后台线程的复杂性)。
案例 2:必须在反射代码中显示“天要塌下来”的 证据。(如果有人想支持这一点,也欢迎他们解释旋转后台线程的复杂性)。
案例 3: 实际上,RIA 服务加载方法的返回值通常用于分配延迟加载数据源。回调不使用它。回调被传递给它自己的上下文,加载的数据,作为参数。
您不在乎(因为您这样做/不应该使用回调中的赋值)。
首先,我会说在没有任何假设的情况下编写您的回调。但除此之外,我看不出回调是如何在分配之前发生的。加载操作必须在线程旋转后立即返回。