none
Ejecución de método en asíncrono en un botón. RRS feed

  • Pregunta

  • Tengo código legacy Windows forms.
    En un action de botón  quiero llamar a un método (TrackButton) en asíncrono, tipo fire and forget, cómo mucho si hay error hacer tratamiento
    El método TrackButton(button); accede  a base de datos, puede a veces no tener conexión, pues se active un Tunneling en el equipo.

    public void ButtonClickOneEvent(object sender, EventArgs e)
            {
                var button = sender as DevExpress.XtraEditors.SimpleButton;
                var name = "";
                try
                {
                    name = button.Name;
                    var methodName = name + "_ActionButton";
                    MethodInfo mi = this.GetType().GetMethod(methodName);
                    mi.Invoke(this, null);
                    TrackButton(button);
                }
                catch (Exception ex)
                {
                    var msg = "ERROR ACCION " + name + ". " + ex.Message;
                    DevExpress.XtraEditors.XtraMessageBox.Show(msg, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    TrackButton(button, msg);
                }
            }
    

    Cuál es la mejor forma? y que no haya problemas de interbloqueos, etc?
    miércoles, 31 de julio de 2019 15:44

Todas las respuestas

  • hola

    Estas planteando muchas cosas juntas

    Mencionas algo legacy pero segun veo se trata de controles DevExpress

    que hace TrackButton() porque alli parece solo un metodo y no veo que relacion tiene el el Invoke() ? es mas no veo para que se usa ese Invoke() me pare innecesario no estas ejecutando dentro de un Thread ni lanzando uno

    >>accede  a base de datos, puede a veces no tener conexión, pues se active un Tunneling en el equipo

    que tiene que ver el tunneling ? te conectas a la db por VPN

    que no tenga conexion en que afecta? es solo un exception que debes tratar eso es todo

    >>que no haya problemas de interbloqueos, etc?

    a que llamas interbloqueos ? que te conectes a una db para consultar datos no deberia bloquear nada

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 31 de julio de 2019 16:20
  • INvoke es reflection para llamar a método:

    var methodName = name + "_ActionButton";


    TrackButton() conecta a base de datos, si hay Tunneling activo, daría un error sí, pero el tiempo (supongamos que 5 segundos) que tarda en intentar conectar y genere error, Podemos hacerlo asíncrono.

    Una forma:

    BackgroundTaskManager.Run(() => TrackButton() ());

    Otras: Thread.Start, ThreadPool, Task.Run ?

    HostingEnvironment.QueueBackgroundWorkItem(async cancellationToken => await LongMethodAsync());

    But it only works within ASP.NET domain, y estoy en Windows Forms

     
    jueves, 1 de agosto de 2019 4:26
  • Otras técnicas:

    ThreadPool.QueueUserWorkItem( this.Worker, callBack ); 
    
    BackgroundProcess.Add("Printing", new WaitCallback(generateReport), null);

    viernes, 2 de agosto de 2019 7:08