如何调用Invoke在我的后台线程上运行MessageBox.Show?
当我在单个后台线程上显示MessageBox时,它通常显示在主窗体后面,所以为了使程序可用,我需要将它显示在主窗体的前面。
我当前的代码是MessageBox.Show(myMessageText, myTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
,没有所有者。不从表单本身调用此代码。但是从我在外面建造的辅助班。
我想在我的后台线程上添加一个所有者到MessageBox,所以我正在寻找运行此代码:
MessageBox.Show(myOwnerForm, myMessageText, myTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
在我想要运行它的时候,myOwnerForm.InvokeRequired
返回true,所以我知道我需要调用一个invoke方法。但是怎么样? (如果我只是调用这段代码,我会得到一个异常,这在其他地方被广泛记录)。由于MessageBox也应该在UI上停止处理,我想使用Invoke,而不是BeginInvoke。
如何使用invoke运行Messagebox.Show?
在看了StackOverflow和其他地方的几个小时后,我只能看到部分解决方案。
我的应用程序使用Windows Forms,使用Visual Studio 2010在VB.NET中开发。
答案 0 :(得分:1)
Invoke方法接受一个被调用的委托(回调函数)以及可选的任何参数。从MSDN引用:
在拥有控件底层窗口句柄的线程上执行指定的委托。
MessageBox
示例代码(Invoke
可以更改为Me.Invoke
):
someControl.Invoke
正如许多评论员所说,在线程中/从线程中执行UI(与用户交互)是一种不好的做法。如果在线程中发生事件时需要向用户显示MessageBox,则创建/使用某些消息传递系统。