簡體   English   中英

等待線程完成而無需按住UI線程

[英]Wait for Threads to Finish without holding up UI thread

我目前正在嘗試在測試軟件上實現自動保存功能。

“開始”按鈕將觸發TestThread進行測試。 通過TestThread的調用來更新UI,以向測試人員提供有關測試的實時信息。 當用戶單擊“停止”按鈕時,將設置一個標志,指示TestThread完成當前測試並停止。 它還禁用UI上的控件,並觸發StopThread來監視TestThread的進度。 當TestThread完成時,StopThread將重新啟用UI控件。

此時,我需要等待StopThread完成,以便可以調用自動保存(導致Excel文件生成的SaveFileDialog)。 但是,在“停止”按鈕單擊處理程序中使用StopThread.Join()似乎只會導致程序掛起。 這可能是因為TestThread需要花費一些時間才能完成並嘗試更新被阻止的UI線程。

從StopThread調用save函數會生成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.
    }

根本不要阻塞StopThread 而是安排StopThread向主線程發出已完成的信號。 例如,使用Invoke

有沒有一種方法可以從StopThread調用SaveFileDialog並將其編組到UI線程?

您為什么不只使用Control.InvokeDispatcher.Invoke ,就好像您來自TestThread?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM