Usuario
Ejecución de método en asíncrono en un botón.

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 tratamientoEl 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?
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- Propuesto como respuesta Pablo RubioModerator miércoles, 31 de julio de 2019 20:19
-
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
- Editado Miriam Pasion jueves, 1 de agosto de 2019 4:27
- Propuesto como respuesta Pablo RubioModerator jueves, 1 de agosto de 2019 16:31
-