none
Un poco de explicacion sobre programacion asincrona RRS feed

  • Pregunta

  • Hola, mi problema surgio consumiendo un servicio de WCF, el cual al llamar a algun metodo de este, habia un periodo de retraso, bueno, entonces empece a investigar un poco sobre metodos asincronos, y me tope con algo que me cayo del cielo en http://www.codeproject.com/KB/WPF/AsynchronousWPF.aspx, bueno, el problema lo resolvi, basicamente era congelar la pantalla con un dialogo con algo dando vueltas por un determinado tiempo. Este es mi codigo:

    private void btnInvocarMetodo_Click(object sender, RoutedEventArgs e) {
          Action<int> EjecucionServicio = (int millis) => {
            System.Threading.Thread.Sleep(millis);        
          };
    
          AsyncCallback CallbackMethod = (IAsyncResult ar) => {
            try {
              AsyncResult result = (AsyncResult)ar;
              Action<int> callerDelegate = (Action<int>)result.AsyncDelegate;
    
              callerDelegate.EndInvoke(ar);
    
              Action update = () => {
                waitDialog.Close();
                this.Effect = null;
              };
    
              this.Dispatcher.Invoke(DispatcherPriority.Normal, update);
            }
            catch (Exception ex) {
              // TODO: controlar exception
            }
          };
    
    
          BlurEffect blur = new BlurEffect();
          this.Effect = blur;
          waitDialog = new DialogoEspera();
          
          EjecucionServicio.BeginInvoke(3000, CallbackMethod, null);
    
          waitDialog.ShowDialog();
        }
    


     

    Pues bien, a lo que entendi, al utilizar el evento BeginInvoke, estoy diciendo que ese metodo es asincrono, y en el callback, realizo el casting del delegado asincrono y lo finalizo llamando al metodo EndInvoke, pero cuando comento estas tres lineas de codigo:

     

    AsyncResult result = (AsyncResult)ar;
    Action<int> callerDelegate = (Action<int>)result.AsyncDelegate;
    
    callerDelegate.EndInvoke(ar);
    

    Mi aplicacion sigue funcionando sin problemas, y aqui es donde viene mi duda, en que casos es necesario realizar el casting y finalizar al delegado con el metodo EndInvoke???

     

    Gracias.

     


    Serg
    viernes, 5 de agosto de 2011 4:45

Respuestas