yes visual studio personalizados messageboxbuttons ejemplos critical botones c# winforms multithreading

visual - messageboxbuttons c#



Llame a MessageBox desde un hilo asíncrono con Form1 como padre (5)

En mi caso, estaba en otra clase y tenía una referencia para un cuadro de texto, así que utilicé el siguiente código:

_txtResultado.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate () { MessageBox.Show("My message!"); }));

Después de hacer clic en el botón button1 ubicado en form1 , el programa verifica si la nueva versión está disponible (a través de Internet), pero lo hace en el nuevo hilo (para no congelar el formulario durante la verificación).
Cuando se encuentra o no la nueva versión, se muestra el MessageBox apropiado, pero no tiene padre (porque se llamó desde el hilo, no directamente desde form1 ).

¿Cómo hacer que MessageBox muestre con form1 como padre?


Si bien la respuesta seleccionada proporciona una buena forma de mostrar el MessageBox desde un hilo asíncrono, no controla el caso en el que desea recuperar el DialogResult de ese MessageBox particular que se muestra.

Si está buscando devolver un DialogResult del MessageBox invocado que se muestra en la parte superior del Form . Entonces necesitas usar el delegado funcional en lugar del delegado de Action .

Action delegados de Action siempre devuelven void mientras que Func tiene un valor de retorno.

Aquí hay un pequeño método que he ideado para manejar este escenario particular:

private DialogResult BackgroundThreadMessageBox(IWin32Window owner, string text) { if (this.InvokeRequired) { return (DialogResult) this.Invoke(new Func<DialogResult>( () => { return MessageBox.Show(owner, text); })); } else { return MessageBox.Show(owner, text); } }

Aunque esto no suele considerarse una mejor práctica o diseño, funcionará en caso de necesidad.


Trate de usar un backgroundworker .

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) { //Helper thread: Long during task } private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { //We''re in the main thread: Show your messagebox }


this.Invoke(new Action(() => { MessageBox.Show(this, "text"); }));

Esto cambiará al hilo principal y mostrará MessageBox con el padre de form1 .


if ( Form1.InvokeRequired ) { Form1.Invoke((Action)delegate{MessageBox.Show(Form1,"Hello");}); }