所以我在我的应用程序中有一个线程,其目的是收听来自服务器的消息并根据它收到的内容采取行动。
当我想从服务器发出消息时遇到问题,当客户端应用程序收到消息时,客户端应用程序将打开一个新表单。然而,这个新形式立即冻结。
我认为正在发生的事情是新表单被加载到与监听服务器的线程相同的线程上,当然这是忙于监听流,然后阻塞线程。
通常,对于我在客户端监听线程中的其他函数,我会使用调用来更新主窗体的UI,所以我想我要求的是,如果这是一种调用新窗体的方法主要形式。
答案 0 :(得分:16)
我认为这是Windows Forms而不是WPF?在后台线程中,您不应尝试创建任何表单,控件等或操纵它们。这只能在运行消息循环并可以处理Windows消息的主线程中起作用。
因此,为了让代码在主线程而不是后台线程上执行,您可以像这样使用Control.BeginInvoke方法:
private static Form MainForm; // set this to your main form
private void SomethingOnBackgroundThread() {
string someData = "some data";
MainForm.BeginInvoke((Action)delegate {
var form = new MyForm();
form.Text = someData;
form.Show();
});
}
要记住的主要事情是,如果后台线程不需要主线程的任何响应,则应使用BeginInvoke,而不是Invoke。否则,如果主线程忙于等待后台线程,则可能会陷入死锁。
答案 1 :(得分:0)
你基本上自己给出了答案 - 只需执行代码,使用Invoke在GUI线程上创建表单。