我有一個Winform應用程序,它列出了gridview中的一批發票。用戶選擇該批次並單擊按鈕「生成發票」。該過程大約需要4-5分鐘。在運行時,我將有一個選取框進度條,並希望禁用所有按鈕。後臺工作進程或線程?
我應該使用BackgroundWorker進程還是創建一個新線程來運行此任務?
我有一個Winform應用程序,它列出了gridview中的一批發票。用戶選擇該批次並單擊按鈕「生成發票」。該過程大約需要4-5分鐘。在運行時,我將有一個選取框進度條,並希望禁用所有按鈕。後臺工作進程或線程?
我應該使用BackgroundWorker進程還是創建一個新線程來運行此任務?
這是BackgroundWorker所指的任務的確切類型。你應該把它推入一個後臺工作者,並允許它運行。這提供了一個簡單的方法來更新您的進度條等。
沒有理由爲此創建自己的線程。通過BackgroundWorker的ThreadPool可以很好地工作。
如果你在worker中有內存泄漏,肯定是後臺進程。
這裏沒有提到泄漏...... – 2009-08-27 19:39:12
內存泄漏進入它的地方 - 留在點上。 ]。 – MoonKnight 2011-10-11 13:44:08
後臺工作進程的線程數量有限(20或25,不能準確記住),並使用其中的一個將使該線程停止運行4-5分鐘。一般而言,建議不要使用後臺工作進程執行長時間運行的任務,但是如果您一次只運行一個線程,則這不是一個真正的問題。
在理想的世界中,我可能會創建自己的線程,但這需要努力和理解。
一個單獨的過程當然會更安全:如果它有任何問題(崩潰,無限循環,泄漏或其他) - 這些問題不會影響父進程。
後臺工作人員更容易,併爲您的案件(check the first few lines of msdn)準確設計。
所以我會按照KISS原則:)
其實後臺工作,甚至比正常快線! 因爲它由線程池支持,所以它避免了昂貴的線程重新創建。
關於通過Jaimal Chohan提到的限制:由於後臺工作由線程池支持它擁有25並行任務的限制,但應足以讓任何GUI應用程序了。 (如果你以某種方式超過這個數字,進一步的任務將簡單地等待其他任務完成)
背景工作者是否使用框架中的相同線程池?爲什麼不直接使用threadpool呢? – RollRoll 2013-01-31 03:59:01
@ThePoet它使用相同的線程池。它提供了很多功能,用於自動編組進度和完成回到初始同步情況下,雖然。如果你使用'ThreadPool.QueueUserWorkItem',你必須自己進行編組,這更容易出錯。 – 2013-01-31 18:35:33