【问题标题】:how to cancel WCF service call?如何取消 WCF 服务调用?
【发布时间】:2010-10-31 06:41:47
【问题描述】:

我有一个长时间执行的 WCF 函数,所以我在 UI 中用 backgraundworker 调用该函数...我想提供一个取消执行的功能,所以我中止了 IComunicationObject,问题是服务执行不停止,在这种情况下有没有办法停止服务执行?

【问题讨论】:

  • 您找到解决方案了吗?如果有,可以分享一下吗?
  • @jmelosegui,不,我无法停止服务器完成这项工作,但目前据我所知这是不可能的,您的服务器应该支持取消,所以您应该在服务器端有 bagin/cancel 功能,并在客户端取消的情况下调用服务器取消

标签: wcf request-cancelling


【解决方案1】:

创建一个 CancelOperation() 方法,在您的服务中设置一些静态 ManualResetEvent。经常在您的 Operation 方法中检查此事件。或者,如果您的服务可以同时处理多个操作调用,则可以是 CancelOperation(Guid operationId)。

【讨论】:

  • 感谢您的回复!这是一个好习惯吗?还是只是一种方法?
  • 只是一种方法,不确定是否有任何“最佳实践”
【解决方案2】:

您可能不需要 BackgroundWorker。您可以进行 IsOneWay 操作,也可以实现 asynchronous pattern。为防止出现线程问题,请考虑使用SynchronizationContextProgramming WCF Services 在解释这些方面做得很好。

【讨论】:

    【解决方案3】:

    如果您正在使用异步调用,需要了解的重要一点是,仍然无法取消请求并阻止服务在启动后返回响应。您的 UI 可以智能地处理响应以避免竞争条件。幸运的是,有一种简单的方法可以做到这一点。

    此示例用于搜索订单 - 由 UI 驱动。让我们假设返回结果可能需要几秒钟,并且用户正在背靠背运行两次搜索。

    因此,如果您的用户运行了两次搜索并且第一次搜索在第二次之后返回 - 您需要确保不显示第一次搜索的结果。

       private int _searchRequestID = 0; // need one for each WCF method you call
    
    
       // Call our service...
       // The call is made using the overload to the Async method with 'UserToken'.
       // When the call completes we check the ID matches to avoid a nasty
       // race condition
       _searchRequestID = _searchRequestID++;
       client.SearchOrdersCompleted += (s, e) =>
       {
           if (_searchRequestID != (int)e.UserState))
           {
               return; // avoid nasty race condition
           }
    
           // ok to handle response ...
        }
        client.SearchOrdersAsync(searchMessage, _searchRequestID);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多