【发布时间】:2011-03-03 15:09:15
【问题描述】:
(假设有一个名为“MyFunction”的 WCF 方法)
目前,为了支持取消 WCF 请求,我正在使用 svcutil 生成的 BeginMyFunction/EndMyFunction 方法(并在将结果分派到主线程时处理 isCanceled 标志)。我想使用 MyFunctionAsync 方法(并改为挂钩到 MyFunctionAsyncCompleted 事件)进行异步调用,而不是 Begin/End。
如果使用 MyFunctionAsyncCompleted,处理取消 WCF 请求的最佳/受支持方法是什么,并且仍然确保在不再加载的页面上不会触发事件(即框架内的页面导航)。
谢谢!
编辑:
我决定要在每次调用的基础上创建我的 WcfClient 对象(而不是每个 WPF 页面或每个应用程序),所以这是我想出的:
public void StartValidation(){
WcfClient wcf = new WcfClient();
wcf.IsValidCompleted += new EventHandler<IsValidCompletedEventArgs>(wcf_IsValidCompleted);
//pass the WcfClient object as the userState parameter so it can be closed later
wcf.IsValidAsync(TextBox.Text, wcf);
}
void wcf_IsValidCompleted(object sender, IsValidCompletedEventArgs e) {
if(!m_IsCanceled){
//Update the UI
//m_IsCanceled is set to true when the page unload event is fired
}
//Close the connection
if (e.UserState is WcfClient) {
((WcfClient)e.UserState).Close();
}
}
我发现很难弄清楚完成我刚刚实施的建议的方法是什么。这是原样的,还是我需要担心的陷阱/边缘情况?正确取消 WCF 调用的黄金标准是什么?
【问题讨论】:
-
这样,您并没有真正取消呼叫(即它仍在运行完成。)您只是在检查是否应该忽略结果,对吗?
-
非常正确。这现在可以确保至少我的 UI 在页面卸载后不会更新。我正在研究我应该在卸载事件中进行哪些调用序列(即关闭、中止等)以绕过我当前使用的这种“标记”技术。
-
在卸载时调用
Abort并不总是取消请求(事实上,请求几乎总是完成,Fiddler 证明了这一点)。我在服务器端添加了 5 秒的延迟,让我有时间中止呼叫。这不是我所期望的。 -
好吧,我想实际上不可能“取消”已经发送到服务器的请求。你会怎么做?追赶它并告诉它回来? (抱歉,无法抗拒 ;-) 所以归根结底,“取消”Web 服务请求只发生在应用层。我假设调用 Abort() 只会忽略来自服务器的待处理响应,并且可能会释放一些本来会在以后释放的资源。
标签: wpf wcf asynchronous