如何取消WCF服务电话?

时间:2009-06-04 09:55:23

标签: wcf request-cancelling

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

如果您正在使用异步调用,要了解的一件重要事情是,仍然无法取消请求并阻止在服务启动后从服务返回响应。您的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);