C# WinForms窗体冻结

C# WinForms窗体冻结,c#,.net,winforms,C#,.net,Winforms,在一个表单(F1)上,我有一个按钮,如果我从中创建另一个表单(我们称之为F2)并显示它,就没有问题 但是我想做这样的事情 我的应用程序中的某个线程正在运行连接并侦听来自服务器的消息。当消息到达时,我的主窗体被注册以获取运行函数的事件。从这个函数中,我试图创建并显示F2类型的表单(空,其中没有修改):它显示它,但随后它冻结了我的应用程序 更确切地说: public partial class Form1 : Form { public Form1() { Initi

在一个表单(F1)上,我有一个按钮,如果我从中创建另一个表单(我们称之为F2)并显示它,就没有问题

但是我想做这样的事情

我的应用程序中的某个线程正在运行连接并侦听来自服务器的消息。当消息到达时,我的主窗体被注册以获取运行函数的事件。从这个函数中,我试图创建并显示F2类型的表单(空,其中没有修改):它显示它,但随后它冻结了我的应用程序

更确切地说:

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-现在检查一下,我忘了输入目标名称:)。