我一直坚持这个问题很长一段时间。我有一个VB.Net项目,我有几种形式。但是,如果其中一个窗体冻结或崩溃,整个应用程序崩溃。我无法找到一种方法,当每个表单显示时,它或者在一个单独的进程中,或者是新的线程,并且能够保留与其他表单通信的能力,就像它在主要表单上一样UI线程。我迫切需要找到一种方法来做到这一点,但每次我用新表单创建一个新线程时,表单立即关闭。这甚至可能吗?
答案 0 :(得分:4)
你应该知道两件事。
虽然完全有可能在两个单独的线程上运行两个单独的表单,但这是一个糟糕的设计(除非你真的知道你在做什么)。如果要在单独的线程上创建表单,那么您还负责在该线程上创建消息循环(否则您的表单将冻结)。
具体而言,您可以使用Application.Run
_thread = New Thread(Sub()
Using frm As New SomeForm
Application.Run(frm)
End Using
End Sub)
_thread.Start()
不同线程上的表单之间的通信与普通线程和表单之间的通信没有区别。您可以使用ConcurrentQueue
个消息,其中一个线程为另一个线程写入指令,或简单的共享变量。您必须确保每个线程仅更改其创建的表单的组件或控件。要在线程之间操纵控件,必须使用Invoke
。