我正在寫一個程序,可能需要相當多的加載(5-30秒)。我想要一個以選取框樣式進度條開始的表單,以便用戶知道有些事情正在完成。進度條形式不完全加載
public FrmMain()
{
var loading = new FrmLoading();
loading.Show();
InitializeComponent();
// other start up code here
loading.Close()
}
現在,loading
彈出來就好了。問題在於標籤和進度條沒有任何顯示,而且看起來好像正在崩潰。我查看了BackgroundWorker
,但說實話,我並沒有完全理解如何爲我做這項工作。我試圖按照教程和例子在:
但我的頭只是沒有抓住它。有沒有其他方法可以正確加載表單?感謝任何和所有的幫助。
編輯
我BackgroundWorker
嘗試包括我創造它進行全在我FrmMain
都做的動作的函數。所以,我有:
public FrmMain()
{
Loading = new FrmLoading();
Loading.Show();
backgroundWorker1.RunWorkerAsync();
}
private void FormLoading()
{
// Initialize and loading elements of the form
InitializeComponent();
}
private void BackgroundWorker1DoWork(object sender, DoWorkEventArgs e)
{
FormLoading();
}
private void BackgroundWorker1RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
Loading.Close();
}
但我一直在backgroundWorker1.RunWorkerAsync();
這正是使用後臺工作者的情況。請說明您使用該解決方案時遇到的問題。一般的做法很簡單。構造函數顯示加載表單,啓動後臺工作,'DoWork'事件執行長時間運行的任務,並且完成的事件關閉加載表單。技術上還有其他一些方法,例如使用任務,異步/等待,直接線程訪問等,但如果您在BGW中遇到問題,那麼使用這些方法會更困難,更不容易。 – Servy
問題是您正在執行主(UI)線程中的所有處理。當你這樣做時,線程沒有機會繪製控件,Windows認爲你的應用程序被卡住了。正如@Servy寫的,你應該在後臺線程(一個'BackgroundWorker'適合於這個)中進行處理,然後在完成時返回主線程。 – Groo
編輯顯示'BackgroundWorker'嘗試。 – MyCodeSucks