我創建一個應用程序,它啓動一個FormSelect(),要求用戶在列表中選擇一個項目,當用戶按下「Select」按鈕時,它將創建一個MainForm的新實例),隱藏FormSelect並顯示MainForm,但它不工作,我得到一個異常,我做了所有的測試。表單不顯示線程
下面是一些代碼:
static class Program {
public static MainForm mainForm;
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main() {
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FormSelect());
}
}
沒什麼特別的我FormSelect,所以這裏是點擊該按鈕在那裏開始的MainForm:
private async void btnSelect_Click(object sender, EventArgs e) {
loadingSpiner.Visible = true;
btnSelect.Enabled = false;
int index = listProcess.SelectedIndex;
await startMainForm(index);
this.Hide();
Program.mainForm.Show();
}
private async Task startMainForm(int index) {
await Task.Run(() => {
Program.mainForm = new MainForm(runningProcess[index]);
});
}
正如你可以在上面看到,我使用任務啓動MainForm,所以它不凍結我的用戶界面和我的「加載spiner」
但是,當它嘗試使用.Show()我得到一個跨線程異常,所以我試圖調用該actio N使用:
this.Invoke(new MethodInvoker(delegate() { Program.mainForm.Show(); }));
但是,使用上面的方法我得到一個異常說:
型「System.ComponentModel.Win32Exception」發生在System.Windows.Forms.dll中的一個例外,但在沒有處理用戶代碼
附加信息:創建窗口句柄時出錯。
如果我在startMainForm方法中刪除了「await Task.Run()...」,那麼一切正常,但它完全阻止了FormSelect UI。
我該如何避免這個問題?謝謝!
你不應該從uithread中打開任何ui。 –
除了用於調用「Application.Run」的線程(通常稱爲UI線程)外,您無法在任何線程上創建UI。 – Enigmativity
我認爲在運行應用程序時啓動的「默認窗體」在Program.cs中指定。在Program.cs中,你應該能夠找到調用來啓動該表單,該表單應該被阻塞(因爲那時我們是單線程的),並且在添加代碼以啓動下一個表單之後? – XtrmJosh