挂起VB.NET中另一个线程的线程

挂起VB.NET中另一个线程的线程,vb.net,multithreading,Vb.net,Multithreading,我有一个从线程运行的窗口,我们称之为MainThread,还有一个执行其他非图形任务的后台线程 有时,后台线程会调用MessageBox.Show(…)方法(即modal并停止后台线程)。在此调用之前,我想挂起主线程并在调用后恢复,以便在显示messageBox时禁用主窗口的控件 因此,我的问题是: 如何从后台线程访问主线程 如何挂起/恢复它(考虑到Thread.suspend已被去除润滑) 您可以使用控件。调用(Windows窗体)或调度程序。调用(WPF)来实际显示主线程上的消息框,但可以

我有一个从线程运行的窗口,我们称之为MainThread,还有一个执行其他非图形任务的后台线程

有时,后台线程会调用
MessageBox.Show(…)
方法(即modal并停止后台线程)。在此调用之前,我想挂起主线程并在调用后恢复,以便在显示
messageBox
时禁用主窗口的控件

因此,我的问题是:

  • 如何从后台线程访问主线程
  • 如何挂起/恢复它(考虑到Thread.suspend已被去除润滑)

您可以使用
控件。调用
(Windows窗体)或
调度程序。调用
(WPF)来实际显示主线程上的消息框,但可以从后台线程调用它,而不是挂起主线程


除了提供您希望的行为外,这还具有允许您将消息框设置为适当窗口的父窗口的优点,这将提供适当的模式消息框行为。

挂起主线程毫无意义,MessageBox已经是一个禁用UI的模式对话框。只需在您的工作程序中使用Control.Invoke()或Dispatcher.Invoke(),我只建议用于通信的事件。不知道线程的暂停。谢谢,我已经知道我可以这样做,但我不认为它会停止背景线程。为什么会这样?是因为我从主线程启动了后台线程吗?@SimonCorcos使用
Invoke
(而不是
BeginInvoke
)阻塞,直到代理完成,这在您关闭消息框之前不会发生。好的,非常感谢,这有助于我进一步了解多线程。请允许我问最后一个问题。为什么我只能从Windows窗体对象调用invoke?为什么不从任何其他对象?为什么在我可以添加的引用列表中找不到System.WindowsBase程序集(其中包含dispatcher类)?(目前在VS2012 Ultimate中)@SimonCorcos Invoke是Control-(或Dispatcher)上的一个方法,因此您需要对理解并提供该方法的对象进行“调用”。程序集只是“WindowsBase.dll”(无系统)。