2012-05-18 35 views
2

我目前正試圖在測試軟件上實現自動保存功能。等待線程完成而不阻止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. 
    } 

回答

3

StopThread不要擋住的。相反,安排StopThread表示它已完成的主線程。例如通過使用Invoke

+0

啊,我真的需要習慣多線程。感謝您指點我正確的方向。更新我的問題與我如何實施此解決方案。 – Bandoth

1

有沒有一種方法可以從StopThread中調用SaveFileDialog,但將它編組到UI線程?

你爲什麼不只是使用Control.InvokeDispatcher.Invoke,在正是這聽起來好像你是TestThread以同樣的方式?