На форме (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();
}
}
Я думаю, причина в том, что вы выполняете межпотоковые операции. Вам нужно поместить создание формы в поток 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();
}
}
}
используя код 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();
}
}
}