1

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

4

3 回答 3

2

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

于 2009-06-04T10:20:29.207 回答
2

您可能不需要 BackgroundWorker。您可以进行 IsOneWay 操作,也可以实现异步模式。为了防止线程问题,请考虑使用SynchronizationContext编程 WCF 服务在解释这些方面做得很好。

于 2009-06-04T11:58:10.070 回答
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);
于 2011-07-11T18:10:08.057 回答