由EventHandler创建的C#Windows窗体立即消失

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"你看到表单了吗?"就会显示新表单.在那儿.一旦我单击确定,表单就会消失.

我错过了什么?我认为通过将新表单分配给类变量,它将在方法完成后保持活动状态.显然,事实并非如此.

Nol*_*rin 5

我认为问题在于您是从自定义线程执行处理程序中的代码,而不是 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调用放入您的代码中,但这至少是一个可以使用它的例子.