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

daf*_*ftu 20 c# multithreading winforms

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

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

Ste*_*cya 36

this.Invoke(new Action(() => { MessageBox.Show(this, "text"); }));
Run Code Online (Sandbox Code Playgroud)

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


Der*_*k W 12

虽然所选答案提供了一种显示MessageBox异步线程的好方法,但它不处理您想要DialogResult从显示的特定内容中检索的MessageBox情况.

如果您希望DialogResultMessageBox显示在顶部的调用返回a Form.然后,您需要使用Func委托而不是Action委托.

Action委托总是返回void而Func具有返回值.

这是我设计用于处理此特定方案的一个小方法:

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);
   }
}
Run Code Online (Sandbox Code Playgroud)

虽然这通常不被认为是最佳实践或设计,但它可以在紧要关头工作.


Ars*_*yan 5

  if ( Form1.InvokeRequired ) {
            Form1.Invoke((Action)delegate{MessageBox.Show(Form1,"Hello");});
        }
Run Code Online (Sandbox Code Playgroud)