WPF中的一个bug造成CPU资源拉满

简介: WPF中的一个bug造成CPU资源拉满

在 WPF 里可以使用DashStyle属性实现虚线的功能,通过传入double数组即可实现这个功能,但是如果传入的数组是[0,0]就表示先绘制零宽度线条,再空出零宽度的间隔。这其实是一个震荡收敛,要么整条线绘制的是实线,要么就是什么也不绘制,成为空白。那么就存在一个问题,就是求一个线段有多少个无穷小的点组成的问题。计算机虽然有精度限制,但这个问题所需要计算量非常大,因此会造成渲染线程使得CPU直接拉满。例如下面这段代码:

    class Test : FrameworkElement
    {
        public Test()
        {
            Width = 1000;
            Height = 1000;
        }
        protected override void OnRender(DrawingContext drawingContext)
        {
            var pen = new Pen()
            {
                Brush = Brushes.Black,
                DashStyle = new DashStyle(new double[] { 0, 0 }, 0),
                Thickness = 10,
            };
            var geometry = new LineGeometry(new Point(0, 0), new Point(500, 0));
            drawingContext.DrawGeometry(Brushes.Beige, pen, geometry);
            base.OnRender(drawingContext);
        }
    }

将以上的Test类放到界面里面,并在XAML代码里中放入Grid:

<Grid x:Name="Grid"></Grid>

在代码中,我们设置鼠标移动的时候设置刷新Test:

public partial class MainWindow : Window
{
    private Test t{ get; }
    public MainWindow()
    {
        InitializeComponent();
        t= new Test();
        Grid.Children.Add(t);
        MouseMove += MainWindow_MouseMove;
    }
    private void MainWindow_MouseMove(object sender, MouseEventArgs e)
    {
        Test.InvalidateVisual();
    }
}

运行上述代码,并且鼠标在窗体内华东,我们在任务管理器中可以看到CPU使用率接近于100%。关于这个问题国内已经有人报告给了WPF的开发团队,但目前WPF开发团队并未回复,而且也没有发布补丁,但是就这个问题形成的原因来说,一般在项目中几乎遇不到,因为没有人会将DashStyle属性设置为[0,0],除非他脑子瓦特了。


目录
相关文章
|
1月前
|
移动开发 Linux
Linux下如何查看哪些进程占用的CPU内存资源最多
Linux下如何查看哪些进程占用的CPU内存资源最多
|
7月前
|
Cloud Native Linux 虚拟化
【云原生】Docker容器资源限制(CPU/内存/磁盘)
【云原生】Docker容器资源限制(CPU/内存/磁盘)
867 0
|
SQL 监控 关系型数据库
Postgresql CPU 资源占用过高问题
Postgresql CPU 资源占用过高问题
1198 0
Postgresql CPU 资源占用过高问题
|
4天前
|
运维 Linux Docker
Docker详解(十一)——Docker容器CPU资源限额实战Docker详解
Docker详解(十一)——Docker容器CPU资源限额实战
22 5
|
4天前
|
存储 运维 Linux
Docker详解(十)——Docker容器CPU资源限额配置
Docker详解(十)——Docker容器CPU资源限额配置
20 3
|
3月前
|
C#
浅谈WPF之样式与资源
WPF通过样式,不仅可以方便的设置控件元素的展示方式,给用户呈现多样化的体验,还简化配置,避免重复设置元素的属性,以达到节约成本,提高工作效率的目的,样式也是资源的一种表现形式。本文以一个简单的小例子,简述如何设置WPF的样式以及资源的应用,仅供学习分享使用,如有不足之处,还请指正。
46 0
|
4月前
Dataphin中运行任务所需的资源不仅包括CPU,还有内存
【1月更文挑战第11天】【1月更文挑战第53篇】Dataphin中运行任务所需的资源不仅包括CPU,还有内存
35 2
|
6月前
|
监控 调度 Python
电脑监控软件所含的CPU资源监控的代码(使用psutil库)
本文使用psutil库来获取CPU使用率、运行的进程、CPU温度、风扇速度和CPU核心的工作情况。这些信息可用于自定义电脑监控软件的CPU资源监控功能
486 1
|
9月前
|
弹性计算 人工智能 运维
基于ACK One注册集群实现IDC中K8s集群以Serverless方式使用云上CPU/GPU资源
在前一篇文章《基于ACK One注册集群实现IDC中K8s集群添加云上CPU/GPU节点》中,我们介绍了如何为IDC中K8s集群添加云上节点,应对业务流量的增长,通过多级弹性调度,灵活使用云上资源,并通过自动弹性伸缩,提高使用率,降低云上成本。这种直接添加节点的方式,适合需要自定义配置节点(runtime,kubelet,NVIDIA等),需要特定ECS实例规格等场景。同时,这种方式意味您需要自行
|
缓存 Linux Shell
Docker资源(CPU/内存/磁盘IO/GPU)限制与分配指南
什么是cgroup? cgroups其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组(如CPU、内存、磁盘输入输出等)。 什么是Docker资源限制?