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");});
}