Siguiendo con el modelo asíncrono, hoy explicaré como esperar a un thread en concreto y como realizar una finalización síncrona de forma adecuada.
Para finalizar una operación asíncrona de forma síncrona (bloqueando el hilo actual hasta que el secundario termine) podemos hacerlo de dos formas, llamando al método .EndInvoke del objeto delegado, con el inconveniente de que si tenemos definido un AsyncCallback y hay otro .EndInvoke allí recibiremos una “InvalidOperationException” en alguno de los dos sitios con el mensaje “EndInvoke can only be called once for each asynchronous operation.” que viene a decir “EndInvoke solo puede ser llamado una vez por cada operación asíncrona” con la molestia que ello conlleva; la forma elegante es utilizar el método “IAsyncResult. AsyncWaitHandle.WaitOne” que causará la finalización síncrona pero sin modificar el comportamiento que habíamos previsto en un principio, de esta forma podemos forzar la espera a la finalización de un determinado hilo ó grupo de hilos que por ejemplo realizasen tareas que habría que completar inevitablemente para poder continuar, con la ventaja de que se ejecutarían de forma paralela.
El ejemplo esta basado en el del ejemplo anterior, Modelo Asíncrono. Parte II, control.
(más…)