另一个线程中的Form.ShowDialog

时间:2011-04-14 14:12:42

标签: .net winforms

在主线程中,我创建了一个工作线程,用于创建新表单并调用form.showDialog。在调用form.Close之后,应用程序就会死亡。

为什么会这样?

//called from someone worker thread. not from main thread
    void s_notificationAgent_AgentError(object sender, EventArgs e)
    {
        try
        {
            ConnectingForm form = new ConnectionForm();
            form.ShowDialog();//if i close form clicking on button. app dies(

        }
        catch(Exception ex)
        {

        }                       
    }
UPD:因为我没有权利回答这个问题      我在'编辑'中回答了问题:) 谷歌搜索后我发现..

原因是您在创建它的线程以外的线程上访问Application对象。解决方案是在创建Application对象(或所有者)的线程上调用方法。

它帮助了我:)。

    //called from someone worker thread. not from main thread
    void s_notificationAgent_AgentError(object sender, EventArgs e)
    {          
            //through the synchContext calling methods from GUI thread
         winContext.Send(_=> {form = new Form1();},null);   
         winContext.Send(_=> form.ShowDialog(),null);                                              
    }

1 个答案:

答案 0 :(得分:1)

所有UI代码都在一个线程上运行。一旦该线程结束,应用程序结束,消息泵被拆除,等等。

在您的工作线程中,您需要创建一个新的应用程序并在其上运行,就像您的程序在启动时一样(通常会为您生成此代码)。查看program.cs以查看生成的代码,并将其复制并粘贴到工作线程中。

这样的事情: System.Windows.Forms.Application.Run(new MyDialogInTheWorkerThread());