WinForms форма зависает - PullRequest
5 голосов
/ 19 мая 2010

В форме (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();
    }
}

Ответы [ 2 ]

7 голосов
/ 19 мая 2010

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

  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();
         }
      }
  }
2 голосов
/ 19 мая 2010

используя код Рама, я наконец дошел до этого, и он работает

спасибо!

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();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...