拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 如何在c#WPF中为ui保留一个时运行许多计算繁重的后台执行绪

如何在c#WPF中为ui保留一个时运行许多计算繁重的后台执行绪

白鹭 - 2022-03-11 2026 0 0

我有以下问题:

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

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *