如何取消RIA服务LoadOperation

时间:2012-05-20 22:32:25

标签: c# .net silverlight wcf-ria-services

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

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

如果我接受我的LoadOperation并在其上调用'Cancel'方法,操作似乎取消,但服务器端代码没有停止,并且使用fiddler我可以看到操作完成并且HTTP状态代码为200归还。

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

2 个答案:

答案 0 :(得分:1)

所以我查看了反编译的RIA服务源,看起来取消只是客户端。没有对服务器端进程进行任何更改。

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

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

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

答案 1 :(得分:0)

根据我的理解,使用loadoperation取消服务器端执行是不可用的。

你可能很难运行你自己的取消impelmentation: (取决于您是否使用DomainService base或LinqToEntitiesDomainService base,impelmentation将变化)

服务方

  

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

客户端

  

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

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

希望这会有所帮助 最好的问候

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