簡體   English   中英

Form.Invoke凍結UI

[英]Form.Invoke freezes the UI

我已經搜尋了大約一個小時,但仍然找不到任何解決方案。

我只是嘗試從另一個線程設置進度條的最大值。 所以我找到了Control.Invoke方法。 我一直在執行它:

在此輸入圖像描述

現在,當我調試我的應用程序時,它只是停留在this.Invoke行上。 UI出現,並且被凍結。 因此,我要繼續進行搜索並將其搜索出來,它告訴我使用this.BeginInvoke() 我實現了它,很好,UI不會凍結。 不錯,但是實際上我的進度條的最大值沒有改變:(

我究竟做錯了什么?

編輯:也許有幫助:我正在使用Parallel.Invoke(); 管理我的線程...

僅在工作線程上調用Control.Invoke且UI線程被阻止時, Control.Invoke才會阻止。

您發布的代碼是正確的。 您必須在其他地方阻止UI線程。

我在應用程序中使用下面類似的內容,用於更新進度條的實際值。 我已經從您的示例中對其進行了一些更改。 旋轉一下,看看是否有幫助:)

    public void SetMax(int value)
    {
        if (this.ProgressBar_status.InvokeRequired)
        {
           this.BeginInvoke(new Action<int>(SetMax), value);
           return;
        }
        this.ProgressBar_status.Maximum = value;
    }

我遇到了同樣的問題,由於尼古拉斯的回答,我意識到自己陷入了一個GUI應用程序中的同一個陷阱,以調試Windows服務中使用的類。 服務類在線程中運行大多數代碼。 線程停止時正在回調記錄程序。 我使用按鈕停止它,並且日志記錄使用了調用來更新文本框。 這個問題是如此簡單,我踢了自己-調用正在等待按鈕單擊完成,它正在等待類停止,而該類正在等待調用記錄以使其停止(重復執行,直到任務管理器結束過程為止)。 通過在停止按鈕中單擊創建線程來解決,使用threadproc來停止服務類。 這意味着我不得不在停止之后在新線程的另一次調用中放置更多代碼來更新表單,但是這樣做沒問題,因為它沒有等待主表單線程。

就我而言,錯誤是在啟動線程后使用join() join()防止主線程在子線程完成之前執行代碼。 我刪除了join()命令,並在join()之后將代碼移至線程,一切正常。

我建議最好使用支持工作進度條(包括其他功能)中的進度報告的后台工作程序組件,而不是調用invoke和BeginInvoke。 您可以在下面的MSDN鏈接中找到有關后台工作者的更多詳細信息:

http://msdn.microsoft.com/en-us/library/c8dcext2.aspx

暫無
暫無

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

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