2

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

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

你能告诉我先做哪个手术吗?

callBack 方法是在分配 loadOperation 变量之前调用还是在分配之后调用?

谢谢

4

3 回答 3

2

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

在实践中,我希望异步调用比方法结束时的任何内务处理花费的时间要长得多——Load但我也不会将这个假设放入代码中。除非有明确的同步来确保分配发生在回调之前,否则我认为依赖它不是一个好主意。

即使此时分配总是首先发生,请考虑:

  • 如果此时没有网络连接会发生什么?异步调用可能会很快失败。
  • 如果在客户端添加一些缓存会发生什么?呼叫可能会很快成功。
  • 我不知道您可以针对 RIA 服务进行什么样的测试,但有时您可能希望能够通过使异步调用在同一个线程上执行回调来模拟异步调用 - 这意味着回调可能发生在作业前的测试。你可以通过强制一个真正的异步模拟调用来避免这种情况,但是在测试中处理线程可能会变得很麻烦;有时让一切同步是最简单的。

编辑:我一直在思考这个问题,并试图找出我的直觉背后的原因,即你不应该做出这个假设,即使它在现实中几乎总是会好的。

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

你应该(IMO)开始做一些事情,并随时准备好让它回来。这就是你应该考虑的方式。一旦你开始走下“我确信在返回响应之前我可以做一些工作”的滑坡,你最终会进入一个充满不确定性的世界。

于 2010-10-07T15:33:17.813 回答
0

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

  1. 它在回调之前返回分配。
  2. 回调可能会在分配之前发生。
  3. 你不关心。

案例 1: 根据 .Net Reflector 对相关实际加载方法的调查,在返回发生之前调用回调似乎是不可能的。(如果有人想争辩说欢迎他们解释旋转后台线程的复杂性)。

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

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

StackOverflow 都是关于实用代码的答案,所以唯一实用的答案是选项 3:

您不在乎(因为您这样做/不应该使用回调中的赋值)。

于 2010-10-14T13:32:19.503 回答
0

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

于 2010-10-10T02:37:25.590 回答