WinForms формируют замораживания

На форме (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();
    }
}
5
задан John Saunders 19 May 2010 в 08:17
поделиться

2 ответа

Я думаю, причина в том, что вы выполняете межпотоковые операции. Вам нужно поместить создание формы в поток UI перед созданием формы2. Думаю, вам поможет следующее

  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();
         }
      }
  }
7
ответ дан 14 December 2019 в 01:03
поделиться

используя код 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();
        }
    }
}
2
ответ дан 14 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: