从另一个线程调用form.show()的C#在setup中不起作用

时间:2013-08-24 11:31:56

标签: c# multithreading

在我的c#windows应用程序中,我想在一个由线程检查的条件上显示另一个表单。并且(第二个)线程已被另一个(第一个)线程调用。这是我用来更好地解释的代码:

主要方法:

static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }

Form1方法:

private void Form1_Load(object sender, EventArgs e)
{
        // Call First thread to start background jobs.
        var thread = new Thread(ThreadFirst);
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();

        // Continue my load event stuff here...

}
    private void ThreadFirst()
    {
        // Do some background operations..
        // Call second thread to switch to another background process.
        var thread = new Thread(ThreadSecond);
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();
}

private void ThreadSecond()
{
        If (condition)
                // navigate to another form and close running one..
                ShowAnotherForm();
        else
        {
                // Continue working on current form.
        }
}

[STAThread]
private void ShowAnotherForm()
{
     try
     {
           // Object for new form.
           globalForm = new myForm();
           globalForm.Show();
           // Close the current form running..
           this.Close();
           this.ShowInTaskbar = false;
           Application.Run();           
     }
     catch (Exception ex)
     {
           messagebox.Show(ex.message);
     }
}

当我从我的解决方案中运行它时,它工作得很完美。但是,当我为此创建一个msi包时,两个表单都被隐藏了。我是否遗漏了要添加到其中的内容,以便它在设置中也能正常工作?

感谢。

1 个答案:

答案 0 :(得分:4)

您不应该在“非GUI”线程上调用“GUI Stuff”。您的所有GUI调用都应该在GUI线程上。使用InvokeRequiredInvoke确保所有GUI代码都在正确的线程上完成。谷歌会给你很多例子。