我目前正試圖在測試軟件上實現自動保存功能。等待線程完成而不阻止UI線程
「開始」按鈕觸發TestThread進行測試。 UI通過TestThread的Invokes進行更新,爲測試人員提供有關測試的實時信息。當用戶點擊「停止」按鈕時,會設置一個標誌,通知TestThread完成當前測試並停止。它還禁用UI上的控件並觸發StopThread來監視TestThread的進度。當TestThread完成時,StopThread重新啓用UI控件。
此時,我需要等待StopThread完成,才能調用自動保存(導致Excel文件生成的SaveFileDialog)。但是,在「停止」按鈕中使用StopThread.Join()單擊處理程序似乎只會導致程序掛起。這可能是因爲TestThread需要時間來完成並嘗試更新被阻止的UI線程。
從StopThread調用保存函數會生成一個ThreadStateException,因爲我使用SaveFileDialog(模式窗體),並且顯然要求將調用線程設置爲「單線程公寓」。
對此的搜索似乎指向簡單使用Thread.Join()的一般答案。一個簡單的事實,我需要保持UI活動,直到線程完成使這無法使用。有沒有一種方法可以從StopThread調用SaveFileDialog,但將它編組到UI線程?還有其他建議嗎?提前致謝。
工作液:
private void btn_Stop_Click(object sender, EventArgs e)
{
//Disable UI controls and flag test ending
Thread StopThread = new Thread(WaitForTestEnd);
StopThread.Start();
}
private void WaitForTestEnd()
{
while (!testStopped) //Flag set at end of TestThread
{
Thread.Sleep(50);
}
//Re-enable UI
AutoSave saveMyData = SaveData;
Invoke(saveMyData);
}
private delegate void AutoSave();
private void SaveData()
{
//Generate SaveFileDialog and save.
}
啊,我真的需要習慣多線程。感謝您指點我正確的方向。更新我的問題與我如何實施此解決方案。 – Bandoth