5

我在 Silverlight 项目中使用 RIA 服务。我在客户端使用 LoadOperation 类从服务器加载一些数据。

在加载该数据的过程中,请求可能会被对不同数据的更新请求所取代。这是基于对服务器进行的多个 LoadOperations,然后用户单击取消按钮。

如果我使用 LoadOperation 并在其上调用“取消”方法,操作似乎取消,但服务器端代码并​​未停止,使用 fiddler 我可以看到操作完成并返回 HTTP 状态代码 200。

当您调用“取消”时,它在服务器上做了什么,我希望它调用 ThreadAbortException 或类似的东西?这可以改进吗?

4

2 回答 2

2

因此,我查看了反编译的 RIA 服务源,似乎取消只是客户端。不会对服务器端进程进行任何更改。

基本上,当您运行时operation.Cancel(),它确保操作可以取消(operation.CanCancel),然后将其标记为已取消,并触发完成动作。

这意味着服务器端操作仍在继续,但响应客户端在完成时什么也不做

操作完成后,您需要检查operation.IsCanceled属性以查看该操作是否已取消。如果是这样,请忽略结果。

于 2012-05-31T03:39:44.957 回答
0

据我了解,使用加载操作取消服务器端执行不可用。

您可以艰难地运行自己的取消执行:(取决于您使用的是 DomainService 基础还是 LinqToEntitiesDomainService 基础,执行会有所不同)

服务端

在您的服务方法中开始在新线程中加载将该线程对象放在会话中您的线程对象应该以一种可以取消 DbConnection 的方式...执行服务方法(调用)以取消当前正在执行的线程对象注册在会话中,并将其从会话中删除

客户端

在 LoadOperation 对象上调用取消并调用取消请求。

需要注意的是,您注释掉 OnSessionStart 并在 global.asax 中停止,以便每个用户以多线程方式执行 ria 服务,否则每个请求将等待前一个请求完成(这与 ria 服务线程有关,而不是我们的线程对象)

希望这有助于最好的问候

PS:我们还使用 RIA Services 和 EntityFramework 的悲观锁的类似解决方案,...

于 2012-07-30T07:01:52.217 回答