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情况.
如果您希望DialogResult从MessageBox显示在顶部的调用返回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)
虽然这通常不被认为是最佳实践或设计,但它可以在紧要关头工作.
if ( Form1.InvokeRequired ) {
Form1.Invoke((Action)delegate{MessageBox.Show(Form1,"Hello");});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24605 次 |
| 最近记录: |