如何取消 RIA 服务加载操作

本文关键字:RIA 服务 加载 操作 取消 何取消 | 更新日期: 2023-09-27 18:34:41

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

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

如果我采用我的 LoadOperation 并对其调用"取消"方法,该操作似乎取消了,但服务器端代码并未停止,并且使用小提琴手,我可以看到操作完成并返回 HTTP 状态代码 200。

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

如何取消 RIA 服务加载操作

所以我看了一下反编译的RIA服务源代码,似乎取消只是客户端。不会对服务器端进程进行任何更改。

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

这意味着服务器端操作仍会继续,但响应客户端在完成时不会执行任何操作

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

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

你可以艰难地运行自己的取消影响:(根据您使用的是 DomainService base 还是 LinqToEntitiesDomainService base,影响会有所不同(

服务侧

在您的服务方法中,在新线程中启动加载 将该线程对象放入会话中 您的线程对象应该以可以取消 DbConnection... perpare a service method(Invoke(以取消当前正在执行的 在会话中注册的线程对象,并将其从会话中删除

客户端

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

一个警告是,您按顺序注释掉OnSessionStart并在global.asax中停止以多线程方式为每个用户执行 RIA 服务,否则每个请求将等到上一个请求完成(这与 RIA 服务线程有关,而不是我们的线程对象(

希望这有帮助此致敬意

PS:我们还使用类似的悲观锁解决方案 RIA 服务和实体框架,...