callBack方法是在赋值之前还是之后调用的?

时间:2010-10-07 15:28:49

标签: c# .net silverlight domainservices asynccallback

下面的代码基本上是在SilverLight应用程序中调用域服务。

LoadOperation<tCity> loadOperation = _dataContext.Load(query,callBack, true);

你能告诉我先做了哪个操作吗?

在分配loadOperation变量之前或在分配了loadOperation变量之后调用了callBack方法吗?

由于

3 个答案:

答案 0 :(得分:2)

假设它是一个异步操作,理论上它可能以任何一种方式发生。异步操作应该在另一个线程中进行, if Load返回之前完成,可以在赋值完成之前调用回调。

在实践中,我希望异步调用使的时间长于方法结束时的内容Load - 但我也不会把这个假设放入代码。除非有显式同步以确保在回调之前进行赋值,否则我认为依靠它不是一个好主意。

即使现在首先发生作业,也要考虑:

  • 如果目前没有网络连接会怎样?异步调用可能会很快失败。
  • 如果在客户端添加了一些缓存,会发生什么?电话会很快成功。
  • 我不知道你能对RIA服务做什么样的测试,但有时候你可能希望能够通过让它们在同一个线程上执行回调来模拟异步调用 - 这意味着回调在分配之前,可以在测试中发生。你可以通过强制一个真正的异步模拟调用来避免这种情况,但是在测试中处理线程会变得毛茸茸;有时最简单的方法就是让所有东西同步。
编辑:我一直在考虑这个问题,并试图弄清楚我的直觉背后的原因,你不应该做出这样的假设,即使它在现实中几乎总是很好。

依赖于操作的顺序违背了异步的精神。

你应该(IMO)设置一些东西,随时准备让它回来。这就是你应该思考的方式。一旦你开始滑坡“我确信我能够在回复之前做一点的小工作”你最终会陷入一个充满不确定性的世界。

答案 1 :(得分:0)

首先,我会说你的回调没有任何假设。但除此之外,我没有看到在分配之前回调是如何发生的。在线程旋转后,加载操作必须立即返回。

答案 2 :(得分:0)

这个非常具体的RIA服务问题有3个可能的答案:

  1. 它在回调之前返回分配。
  2. 回调可能在分配之前发生。
  3. 你不在乎。
  4. 案例1: 基于.Net Reflector对所讨论的实际加载方法的调查,它似乎不可能在返回发生之前调用回调。 (如果有人想争辩他们欢迎解释旋转后台线程的复杂性)。

    案例2: 可能必须在反射的代码中显示“天空正在下降”的证明。 (如果有人想要支持这一点,也欢迎他们解释旋转后台线程的复杂性。)

    案例3: 实际上,RIA Services加载方法的返回值通常用于分配延迟加载数据源。它不会被回调使用。回调作为参数传递其自己的加载数据上下文。

    StackOverflow完全是关于实际的代码答案,因此唯一的实用答案是选项3:

    您不关心(因为您/不应该使用回调中的分配值)。