【问题标题】:How do I cancel an asynchronous operation in Silverlight/WCF?如何取消 Silverlight/WCF 中的异步操作?
【发布时间】:2011-09-28 23:58:49
【问题描述】:

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

让我澄清一下...我要做的是两次调用 SAME 方法,一个接一个,然后将最后一次调用的结果放入我的集合中。如果我两次调用异步方法,则不能保证第二次调用将首先返回,因此我可能会得到第一次调用的结果最后出现并且在我的集合中得到错误的结果。所以我想做的是在我拨打第二个电话时取消第一个电话,这样我就不会从第一个电话中得到结果。看到已完成的事件参数中如何有一个 Canceled 标志,我认为您应该能够做到这一点。但是怎么做呢?

【问题讨论】:

    标签: silverlight wcf asynchronous


    【解决方案1】:

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

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

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

    更新(随着问题的变化)

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

    但是... :)

    您发现了一个客户端可用性问题。您不应该延迟发送任何服务请求,直到空闲延迟过去。这样,快速选择不会导致多次服务调用。

    还有... :>

    您可能还想向服务调用发送一个序列号并将其作为结果的一部分返回。然后你就会知道它是否是最新的请求。

    【讨论】:

    • 我将开始和结束日期绑定到用户控件,用户可以通过拖动结束或通过拖动整个内容来更改开始或结束。每次开始或结束更改时,我都会调用服务。当他们拖动栏并更改两个日期时,我得到两组结果,第二组是正确的……所以这就是为什么没有空闲延迟。也许不是最好的方法,但是...
    • 您需要在中间的某个地方缓冲调用,而不是经常调用服务(想想您未来的 Azure 账单!:)。目前它就像一个自动完成框,每次按键都会调用(它们通常会在上次按键后等待 0.5 秒)
    • 正如stackoverflow.com/questions/17874542/… 中提到的,当我有 aspNetCompatibilityEnabled="true" 时,我似乎无法再拨打电话...也就是说,我必须等待第一次通话才能完成,因此我无法通话另一种方法表示第一种方法取消。对此的任何帮助表示赞赏。
    • @Allen Ho:如果您有需要 aspNetCompatibilityEnabled="true" 的服务,请将它们放在单独的 IIS 服务/站点中。
    【解决方案2】:

    听起来您真正想做的是忽略除最近一次呼叫之外的所有响应。

    为请求设置一个唯一 ID(可以是请求号、Guid、时间戳或其他),并确保服务发回相同的值。保留最近请求的 ID,忽略与该 ID 不匹配的响应。

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

    【讨论】:

    • 我想出了如何不必拨打电话,但 id 听起来是个好主意,我必须记住这一点以备将来使用。谢谢。
    • 跟踪最近的调用 Davy8 是个好主意,但是如果不更改服务器端代码并​​沿线路传递 ID 就不可能实现这一点吗?我的意思是不能通过一些客户端技巧来做到这一点吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多