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],除非他脑子瓦特了。


目录
相关文章
|
7月前
|
移动开发 Linux
Linux下如何查看哪些进程占用的CPU内存资源最多
Linux下如何查看哪些进程占用的CPU内存资源最多
|
Cloud Native Linux 虚拟化
【云原生】Docker容器资源限制(CPU/内存/磁盘)
【云原生】Docker容器资源限制(CPU/内存/磁盘)
2146 0
|
SQL 监控 关系型数据库
Postgresql CPU 资源占用过高问题
Postgresql CPU 资源占用过高问题
1469 0
Postgresql CPU 资源占用过高问题
|
4月前
|
Java 编译器 Linux
JVM/编译器/CPU,究竟谁是卧底?一个曾经困扰我一个月的 bug
任何复杂的系统都可能因为一个小小的疏漏而无法运转,本文记录了一个困扰作者一个月的 bug 最终拨云见日的过程。
|
2月前
|
存储 安全 算法
CPU资源
【10月更文挑战第2天】CPU资源
86 5
|
4月前
|
缓存 Kubernetes 数据中心
在Docker中,如何控制容器占用系统资源(CPU,内存)的份额?
在Docker中,如何控制容器占用系统资源(CPU,内存)的份额?
|
4月前
|
开发者 C# 存储
WPF开发者必读:资源字典应用秘籍,轻松实现样式与模板共享,让你的WPF应用更上一层楼!
【8月更文挑战第31天】在WPF开发中,资源字典是一种强大的工具,用于共享样式、模板、图像等资源,提高了应用的可维护性和可扩展性。本文介绍了资源字典的基础知识、创建方法及最佳实践,并通过示例展示了如何在项目中有效利用资源字典,实现资源的重用和动态绑定。
120 0
|
5月前
|
运维 DataWorks 安全
DataWorks产品使用合集之如何查看空间资源、CPU、内存和存储空间容量
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
4月前
|
C#
WPF 静态资源(StaticResource)和动态资源(DynamicResource)
WPF 静态资源(StaticResource)和动态资源(DynamicResource)
154 0
|
4月前
|
NoSQL MongoDB 索引
MongoDB 占用CPU资源过高
MongoDB 占用CPU资源过高
53 0