我有一個處理大量數據的vb.net應用程序。由於進程的內存要求我這樣做分批,總體規劃結構爲:在等待任務完成時更新UI
Do while Start < TotalNumberOfObjects
[cache data used for the upcoming batch]
For i = Start to Stop
[process data using multiple tasks...for example:]
t=taskfactory.startnew(doStuff(i))
TaskList.TryAdd(t.ContinueWith(Sub()
Me.BeginInvoke(DelegateUpdateProgress, {progress})
End Sub))
Next
[Wait for tasks to complete...
Normally I would wait for the tasks using task.waitall(),
but this will cause the UI to wait to update until all tasks are complete]
Start = Stop+1
Stop = Stop+Increment
[clear data from batch that was just completed]
loop
什麼是正確的方法:
- 等待所有任務完成在轉移到下一批之前?
- 隨着每個任務完成,用整體進度更新UI?
我的目標框架是.NET 4.0。
我很欣賞任何輸入。
編輯:目前我使用task.continuewith()
每個任務完成後更新UI,並呼籲me.beginInvoke
更新形式,
TaskList.TryAdd(t.ContinueWith(Sub()
Me.BeginInvoke(DelegateUpdateProgress, {progress})
End Sub))
但是,這是我怎麼會想到等待列表不兼容任務完成,task.waitall(tasklist)
,因爲調用task.waitall
將導致UI線程等待更新,直到所有任務完成。
@The_Black_Smurf不要電子書籍'中的應用。 DoEvents「(這裏有很多文章解釋了爲什麼它是一個壞主意)。這是多線程必須解決的典型問題。如果你想保持簡單並且只對兩個線程(GUI +所有計算)感興趣,你可以依靠'BackgrounWorker'。 – varocarbas
它在多個線程(GUI +計算+數據庫操作)上運行,因此我創建了許多任務並等待它們完成。 – DrCocoa
然後我不確定我是否理解你的問題。如果你有不同的線程,GUI肯定會更新(它不會被凍結)。你在問什麼時候應該向用戶顯示新信息?在最後還是中間?用您提供的信息非常難以分辨(=無);我想這是個人品味的問題(並且取決於你所談論的確切情況)請記住,SO是關於特定編程問題的具體問題(例如,我如何避免我的GUI被凍結?),不要討論抽象的建議。 – varocarbas