C# 在子線程中開啓新窗口

如果直接在子線程中開啓新窗口,會發現新窗口一閃即逝,此時該窗口的資源是屬於這個子線程的,所以線程結束後,窗口也被釋放了。

此時,可以調用Form的BeginInvoke()方法實現異步委託。

 

首先,在子窗口構造時傳入主窗口的實例

       public ChdForm(MainForm mForm)
       {
            this.mainForm = mForm;
            InitializeComponent();
       }

然後,在子窗口類中寫一個display()方法,用Show實例化一個MethodInvoker,由主窗口實例調用BeginInvoker

        public void display()
        {
            MethodInvoker mi = new MethodInvoker(this.Show);
            this.mainForm.BeginInvoke(mi);
        }

其次,聲明一個類用來實例化子窗口,實例化後調用display()方法

    class OpenFormRobot
    { 
        private MainForm mainForm;
        public OpenFormRobot(MainForm mForm) 
        {
            this.mainForm = mForm;
        }

        public void openChdForm()
        {
            ChdForm chdForm = new ChdForm(this.mainForm);
            chdForm.WindowState = System.Windows.Forms.FormWindowState.Normal;
            chdForm.display();
        }
    }

最後,將OpenFormRobot的實例交給線程類,開啓子線程,並調用openExcelForm()方法

    class OpenFormThread
    {
        private Thread opThread;
        private OpenFormRobot robot;

        public OpenExcelThread(OpenFormRobot opfr)
        {
            this.robot= opfr;
            this.startThread();
        }

        private void startThread()
        {
            this.opThread = new Thread(new ThreadStart(this.openForm));
        }

         private void openForm() 
        {
             this.robot.openChdForm();
        }
    }

 

開啓新窗口時,同時實例化一個OpenFormRobot和一個OpenFormThread。

 

至此,即可完成在子線程中開啓新窗口 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章