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