And*_*ley 1 c# multithreading event-handling .net-2.0 winforms
我不知道为什么会这样,但是当我在EventHandler中创建一个新表单时,它会在方法完成后立即消失.
这是我的代码.为了清晰起见,我编辑了它,但从逻辑上讲,它完全相同.
static void Main()
{
myEventHandler = new EventHandler(launchForm);
// Code that creates a thread which calls
// someThreadedFunction() when finished.
}
private void someThreadedFunction()
{
//Do stuff
//Launch eventhandler
EventHandler handler = myEventHandler;
if (handler != null)
{
handler(null, null);
myEventHandler = null;
}
}
private void launchForm(object sender, EventArgs e)
{
mf = new myForm();
mf.Show();
MessageBox.Show("Do you see the form?");
}
private myForm mf;
private EventHandler myEventHandler;
Run Code Online (Sandbox Code Playgroud)
只要MessageBox"你看到表单了吗?"就会显示新表单.在那儿.一旦我单击确定,表单就会消失.
我错过了什么?我认为通过将新表单分配给类变量,它将在方法完成后保持活动状态.显然,事实并非如此.
我认为问题在于您是从自定义线程执行处理程序中的代码,而不是 UI线程,这是必需的,因为它操作Windows消息泵.您希望在Invoke此处使用此方法来确保表单获取并显示在UI线程上.
private void launchForm(object sender, EventArgs e)
{
formThatAlreadyExists.Invoke(new MethodInvoker(() =>
{
mf = new myForm();
mf.Show();
MessageBox.Show("Do you see the form?");
}));
}
Run Code Online (Sandbox Code Playgroud)
请注意,这假设您已经使用了WinForms对象(已调用formThatAlreadyExists)Application.Run.此外,可能有一个更好的地方将Invoke调用放入您的代码中,但这至少是一个可以使用它的例子.