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