我有一个长时间执行的WCF函数,所以我用backgraundworker调用UI中的函数...我想给一个功能来取消执行,所以我中止IComunicationObject,问题是服务执行不是停止,在这种情况下有没有办法停止服务执行?
答案 0 :(得分:2)
创建一个CancelOperation()方法,在您的服务中设置一些静态ManualResetEvent。经常在您的Operation方法中检查此事件。如果您的服务可以同时处理多个操作调用,则它可以是CancelOperation(Guid operationId)。
答案 1 :(得分:2)
您可能不需要BackgroundWorker。您可以执行操作IsOneWay,也可以实现asynchronous pattern。要防止出现线程问题,请考虑使用SynchronizationContext。 Programming 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);