我有以下问题:
我想撰写一个需要在后台进行繁重的多执行绪计算的 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
0 评论