如果直接在子線程中開啓新窗口,會發現新窗口一閃即逝,此時該窗口的資源是屬於這個子線程的,所以線程結束後,窗口也被釋放了。
此時,可以調用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。
至此,即可完成在子線程中開啓新窗口