2012-05-20 23 views
4

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

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

如果我把我的LoadOperation并调用它的'取消'方法,该操作似乎取消,但服务器端代码不会停止,并使用fiddler我可以看到操作完成,HTTP状态代码为200返回。

,当你调用“取消”是什么在服务器上做的,我希望它来调用一个ThreadAbortException或类似的东西?这可以改善吗?

+0

这是iis6还是iis7? –

+0

IIS 7.5,与Windows 2008 R2的一个 – peter

回答

1

所以我不得不看看反编译RIA服务来源,这似乎是取消是仅限客户端。没有改变服务器端进程。

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

这意味着服务器端的操作仍然继续,但是它完成

时一旦操作完成后,你需要检查operation.IsCanceled属性,看看是否没有与响应客户端完成操作被取消。如果是这样,就忽略结果。

+0

是的,这是我在想什么,但它并没有真正回答这个问题。这个取消的事情只对我有用,如果它也停止服务器上的请求,因为它包含SQL语句,这将加载SQL服务器。如果没有办法做到这一点,那么我不会使用取消。 – peter

+0

是的,不幸的是没有办法取消服务器端操作。 –

0

从我所了解的取消使用加载操作的服务器执行不可用。

你可以强硬运行自己的取消impelmentation: (取决于如果您使用的DomainService基地或LinqToEntitiesDomainService基地impelmentation会变动内容)

服务队侧

在服务方法开工负荷在一个新线程中 把这个线程对象放在会话中 你的线程对象应该以某种方式取消DbConnection ... perpare一个服务方法(Invoke)取消当前正在执行的 线程对象登记在会话,从会话中LoadOperation对象上

客户端

呼叫取消中删除它,并调用取消请求。

一个需要注意的是,你注释掉OnSessionStart并停止在Global.asax中为了 每用户多线程的方式来执行RIA服务其他每个请求将等到前一个请求完成(这必须做与RIA服务线程,而不是我们的线程对象)

希望这有助于 问候

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