如何在Silverlight / WCF中取消异步操作?

时间:2011-09-28 15:42:34

标签: silverlight wcf asynchronous

我从Silverlight应用程序调用异步服务,我希望能够在调用之后取消该调用。服务完成后有一个e.Cancelled选项(例如,如果e.Cancelled Then),但是如何在调用后将其取消为true?你如何取消该异步调用?

让我澄清一下......我想要做的是两次调用SAME方法,一个接一个地调用,并将最后一次调用的结果调到我的集合中。如果我两次调用异步方法,则无法保证第二次调用将首先返回,因此我可能最终得到第一次调用的结果,并在我的集合中出现错误的结果。所以我想做的是取消第一个电话,当我做第二个电话,所以我没有从第一个电话回来的结果。看到完成的事件args中有一个Canceled标志,我认为你应该能够做到这一点。但是如何?

2 个答案:

答案 0 :(得分:5)

它是异步的...传输被传递到远程服务器,并且在服务器完成之前它不会返回。

基本上服务器会继续运行,但您不必等待响应。断开服务已完成的事件处理程序并假装它从未被调用过。这将产生取消操作的效果。

如果您确实需要在服务器上取消正在进行的操作,则需要再次拨打服务器以取消第一次呼叫。假设第一个呼叫是非常慢的,这可能是可能的。

更新(问题已更改)

在您指定的情况下,如果第二个操作通过,则由服务器取消正在进行的操作,而不是客户端。 e.Cancelled设置为服务器端。

然而......:)

您已暴露客户可用性问题。在空闲延迟过去之前,您是否也应该延迟发送任何服务请求。这样快速选择不会导致多次服务呼叫。

另外......:>

您可能还希望向服务呼叫发送序列号,并将其作为结果的一部分返回。然后你会知道它是否是最新的请求。

答案 1 :(得分:1)

听起来你真正想要做的就是忽略除最近一次电话之外的所有响应。

使用请求设置唯一ID(可以是请求#,Guid,时间戳等),并确保服务发回相同的值。保留最新请求的ID,并忽略与该ID不匹配的响应。

这比取消第一个请求更安全,因为如果服务在取消请求发生之前已经开始发送响应,你仍然会得到错误条件。