我有以下問題:
我想撰寫一個需要在后臺進行繁重的多執行緒計算的 WPF 應用程式。現在我只是將執行緒添加到執行緒池,如果找到正確的答案,我會呼叫 Dispatcher.BeginInvoke 方法來更新 UI。所以有時我的執行緒池中有超過 1000 個執行緒等待被執行并且 UI 凍結。
所以我認為我需要一種方法來擁有一個快速佇列,它只運行固定數量的執行緒,同時為 UI 保留一個執行緒,該執行緒始終處于空閑狀態,因此用戶仍然可以與之互動。
有人對如何解決這個問題有一個好主意嗎?或者我是否必須自己實作一個 ThreadQueue 才能做到這一點?
我當前的偽代碼代碼:
WPF 應用程式
init(){
BackgroundWorker.dosomething();
}
updateUI(data){
Dispatcher.BeginInvoke(()=>{
UIFrame = data
})
}
背景作業者
dosomething(){
for(i = 0; i < 50000; i ){
ThreadPool.QueueUserWorkItem(dosomethingElse);
}
}
dosomethingElse(){
//Heavy computation with data as a result
if(foundsomthing){
WPF.updateUI(data);
}
}
uj5u.com熱心網友回復:
由于增加了記憶體使用和切換開銷,運行一千個后臺執行緒可能非常低效。
修復它的一種簡單方法是在后臺執行緒上運行并行回圈。IE
// On UI thread:
var backgroundTask = Task.Run(dosomething);
...
private void dosomething(){
Parallel.For(0, 50000, dosomethingElse);
}
private void dosomethingElse(int index){
...
}
這將限制用于更合理的執行緒數,并且可能會帶來更好的性能。您還可以限制用于始終讓一個或多個 cpu 內核執行其他操作(例如更新 UI)的最大執行緒數。如果每次迭代完成的作業量很小,可以使用磁區來減少執行緒開銷。您可能還想看看DataFlow APIs
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/407132.html
標籤:
下一篇:如何有效地為此撰寫函式?
