从Form1作为父级的异步线程调用MessageBox

时间:2011-03-18 08:18:51

标签: c# winforms multithreading

点击放置在button1上的form1后,程序正在检查新版本是否可用(通过互联网),但是在新主题中执行此操作(在检查期间不冻结表单)。<登记/> 当找到新版本时,会显示相应的MessageBox,但它没有父级(因为它是从线程调用的,而不是直接从form1调用的)。

如何以MessageBox作为父母进行form1显示?

5 个答案:

答案 0 :(得分:34)

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

这将切换到主线程并显示带有form1父级的MessageBox。

答案 1 :(得分:11)

虽然所选答案提供了一种从异步线程显示MessageBox的好方法,但它并不能处理您想从该特定{{1}中检索DialogResult的情况。正在显示。

如果您要从MessageBox顶部显示的已调用DialogResult返回MessageBox。然后,您需要使用Func委托而不是Form委托。

Action代表总是返回无效,而Action有返回值。

我设计了一个处理这种特殊情况的方法:

Func

虽然这通常被认为是最佳做法或设计,但它可以在紧要关头工作。

答案 2 :(得分:4)

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

答案 3 :(得分:1)

尝试使用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
}

答案 4 :(得分:0)

就我而言,我在另一个班级并且有一个文本框的参考,所以我使用下面的代码:

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