C# WinForms窗体冻结
在一个表单(F1)上,我有一个按钮,如果我从中创建另一个表单(我们称之为F2)并显示它,就没有问题 但是我想做这样的事情 我的应用程序中的某个线程正在运行连接并侦听来自服务器的消息。当消息到达时,我的主窗体被注册以获取运行函数的事件。从这个函数中,我试图创建并显示F2类型的表单(空,其中没有修改):它显示它,但随后它冻结了我的应用程序 更确切地说:C# WinForms窗体冻结,c#,.net,winforms,C#,.net,Winforms,在一个表单(F1)上,我有一个按钮,如果我从中创建另一个表单(我们称之为F2)并显示它,就没有问题 但是我想做这样的事情 我的应用程序中的某个线程正在运行连接并侦听来自服务器的消息。当消息到达时,我的主窗体被注册以获取运行函数的事件。从这个函数中,我试图创建并显示F2类型的表单(空,其中没有修改):它显示它,但随后它冻结了我的应用程序 更确切地说: public partial class Form1 : Form { public Form1() { Initi
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
ConnectionManagerThread.getResponseListener().MessageReceived += Form1_OnMessageReceived;
}
private void Form1_OnMessageReceived(object sender, MessageEventArgs e) {
Form2 f2 = new Form2();
f2.Show();
}
}
我认为原因是您正在执行跨线程操作。在创建form2之前,您需要将表单的创建放在UI线程上。我想下面的内容会对你有所帮助
public delegate void ShowForm(object sender, MessageEventArgs e);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
ConnectionManagerThread.getResponseListener().MessageReceived += Form1_OnMessageReceived;
}
private void Form1_OnMessageReceived(object sender, MessageEventArgs e)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new ShowForm((Form1_OnMessageReceived), new object[] { sender, e }));
}
else
{
Form2 f2 = new Form2();
f2.Show();
}
}
}
使用Ram的代码,我终于做到了这一点,它的工作 塔克斯
public delegate void ShowForm(object sender, MessageEventArgs e);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
ConnectionManagerThread.getResponseListener().MessageReceived += Form1_OnMessageReceived;
}
private void Form1_OnMessageReceived(object sender, MessageEventArgs e)
{
ShowForm2(sender, e);
}
private void ShowForm2(object sender, MessageEventArgs e)
{
if (this.InvokeRequired)
{
ShowForm f = new ShowForm(ShowForm2);
this.Invoke(f, new object[] { sender, e });
}
else
{
Form2 f2 = new Form2();
f2.Show();
}
}
}
你试过捕捉那些你认为导致冻结的线条吗?冻结发生在f2.Show()之后。没有错误,也没有例外。我猜问题可能是因为表单实际上是从另一个线程启动的。form2是否也冻结了,或者只是form1?@andrew在这种情况下,我猜form2不是从UI线程创建的,因此没有关联的消息泵@Ram的答案可能是解决方案(一旦你们调试好了:)。我认为“this.BeginInvoke(newshowform(newobject[]{sender,e}));”行有问题。上面写着“error CS0149:Method name expected”@andrew-现在检查一下,我忘了输入目标名称:)。