【问题标题】:Threads vs. GUI in VBVB 中的线程与 GUI
【发布时间】:2017-09-05 20:01:51
【问题描述】:

我说的语言是VB。

我在这个问题上苦苦挣扎了三个多星期,但仍然看不到解决方案。 问题如下: 我在一个子程序中运行了一个密集的计算,同时在这个过程中修改了很多 GUI。一段时间后,应用程序冻结并且“没有响应”。计算完成后,一切都突然发生在我修改过的点上。没什么特别的。 但是,如果我现在尝试使用线程启动子程序,因此应用程序不再冻结,我将无法访问 GUI,因为“它不是由线程本身创建的”。 我该如何解决这个问题? 更具体地说:如何访问有关 GUI 的信息(尤其是 PictureBox 的宽度和高度)并修改 GUI(尤其是在 PictureBox 中设置 BackgroundPicture)? 任何帮助表示赞赏。谢谢!

【问题讨论】:

标签: vb.net multithreading user-interface


【解决方案1】:

您需要阅读如何使用Dispatcher (MSDN Threading Model)

如果只有一个线程可以修改 UI,那么后台线程如何与用户交互?后台线程可以要求 UI 线程代表它执行操作。它通过向 UI 线程的 Dispatcher 注册一个工作项来实现这一点。 Dispatcher 类提供了两种注册工作项的方法:InvokeBeginInvoke。这两种方法都安排一个委托执行。 Invoke 是一个同步调用——也就是说,在 UI 线程真正完成执行委托之前它不会返回。 BeginInvoke 是异步的并立即返回

msdn 文章链接中示例代码的小片段:

startStopButton.Dispatcher
               .BeginInvoke(DispatcherPriority.Normal,
                            New NextPrimeDelegate(AddressOf CheckNextNumber))

【讨论】:

  • 谢谢,我试试看。 :)
  • 请注意,这是 WPF 的解决方案。如果 OP 使用 WinForms,他必须使用 Control.Invoke()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
相关资源
最近更新 更多