如何在VB.NET中的后台线程上调用MessageBox?

时间:2014-02-02 15:30:01

标签: .net vb.net multithreading winforms messagebox

如何调用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中开发。

1 个答案:

答案 0 :(得分:1)

Invoke方法接受一个被调用的委托(回调函数)以及可选的任何参数。从MSDN引用:

  

在拥有控件底层窗口句柄的线程上执行指定的委托。

  • 将<{1}}打包到方法
  • 创建一个委托(与您的消息框方法具有相同签名的方法)
  • 使用MessageBox
  • 致电代表

示例代码(Invoke可以更改为Me.Invoke):

someControl.Invoke

正如许多评论员所说,在线程中/从线程中执行UI(与用户交互)是一种不好的做法。如果在线程中发生事件时需要向用户显示MessageBox,则创建/使用某些消息传递系统。