(Asumiendo un método WCF llamado "MyFunction")¿Cuál es la mejor manera de cancelar una solicitud WCF asíncrona?
Actualmente, para apoyar cancelar una solicitud de WCF, estoy usando los métodos BeginMyFunction/EndMyFunction generados por svcutil (y gastos de una bandera isCanceled cuando el envío de los resultados de la principal hilo). Me gustaría usar el método MyFunctionAsync (y conectarlo al evento MyFunctionAsyncCompleted en su lugar) para llamadas asíncronas en lugar de Begin/End.
¿Cuál es la mejor forma de gestionar las solicitudes WCF canceladas si se utiliza MyFunctionAsyncCompleted y garantizar que el evento no se active en una página que ya no se carga (es decir, navegación de página dentro de un marco).
Gracias!
EDIT:
He decidido que quiero crear mi objetivo WcfClient sobre una base por llamada (a diferencia de per-WPF-página o por aplicación), así que aquí es lo que yo' ve venir con:
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();
}
}
Me resulta difícil averiguar cuál es la forma recomendada para lograr lo que acabo de implementar. ¿Está bien tal como está, o hay problemas/casos extremos de los que debo preocuparme? ¿Cuál es el estándar de oro cuando se trata de cancelar correctamente una llamada WCF?
De esta manera, usted no está realmente cancelando la llamada (es decir, aún se está ejecutando hasta su finalización). Solo está comprobando si debe ignorar los resultados, ¿verdad? – GuyBehindtheGuy
Muy cierto. Esto ahora garantiza que al menos mi UI no se actualice después de que la página se descargue. Estoy investigando qué secuencia de llamadas debo hacer en el evento de descarga (es decir, Cerrar, Abortar, etc.) para eludir esta técnica de "marcado" que estoy usando actualmente. – Pwninstein
Llamar 'Abortar' al descargar no siempre cancela la solicitud (de hecho, la solicitud casi siempre se completa, Fiddler lo demuestra). Agregué un retraso de 5 segundos en el lado del servidor para darme tiempo a abortar la llamada. Esto no es lo que esperaría. – Pwninstein