2011-11-11 49 views
2

我一直在搜索大約一個小時,但我仍然沒有找到任何解決方案。Form.Invoke凍結了用戶界面

我只是嘗試從另一個線程設置進度條的最大值。所以我找到了Control.Invoke方法。我一直走在前面,並實現它:

enter image description here

現在,當我在this.Invoke線調試我的應用程序它只是stucks。用戶界面出現,並被凍結。所以我在前進,谷歌,並告訴我使用this.BeginInvoke()。我實現了它,並且我很好,UI不會凍結。 那平靜不錯,但其實我的進度條的最大值並沒有改變:(

我在做什麼錯

編輯:也許這可以幫助:我使用Parallel.Invoke();來管理我的線程。 ..

+1

我很好奇這是什麼祕密它被pixelated了:p – 2011-11-11 09:45:20

回答

5

Control.Invoke只會在工作線程上調用並阻止UI線程時阻塞。

您發佈的代碼是正確的。您必須在其他位置阻止UI線程。

+0

你在哪裏正確!由於我在UI/main-Thread中使用'Parallel.Invoke',因此它正在忙於等待'Parallel.Invoke'完成運行。所以它可以更新我的進度條的屬性。 – GameScripting

0

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

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

+0

我知道背景工人類,知道如何使用等,但我需要一個解決方案,我的問題沒有其他解決方案;) – GameScripting

2

我在我的應用程序中使用了類似以下類似的東西,我用它來更新進度條的實際值。我已經從你的例子中改變了一點。試一試,看看它是否幫助:)

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

最大值剛剛停留,已經在網絡上找到了解決方案;) – GameScripting

+0

當您在調試時,如果您在設置最大值的線上放置了一個斷點,它會被擊中嗎? – seanzi

+0

不,它不。 – GameScripting

0

我有同樣的問題,並感謝Nicholas的答案,我意識到我已經陷入同樣的​​陷阱在GUI應用程序調試在Windows使用的類服務。服務類在線程中運行其大部分代碼。當線程停止時,該線程回調到日誌記錄過程。我正在使用按鈕停止它,並且使用的日誌記錄調用來更新文本框。問題很簡單,我踢了自己 - 調用正在等待按鈕單擊完成,它正在等待類停止,正在等待調用記錄它正在停止(重複,直到任務管理器結束進程)。通過在停止按鈕中單擊創建一個線程來解決,使用threadproc來停止服務類。這意味着我不得不在之後更新的代碼,在另一個新線程調用中停止,但工作正常,因爲它沒有等待主窗體線程。

0

在我的情況下,錯誤是在啓動線程後使用join()。 join()在子線程完成之前阻止主線程執行代碼。 我刪除了join()命令並將join()後的代碼移動到了線程,並且一切正常。

相關問題