【问题标题】:How to decrease high CPU usage while program writes to WPF textbox?程序写入 WPF 文本框时如何降低高 CPU 使用率?
【发布时间】:2018-08-03 05:32:19
【问题描述】:

我开发小型 WPF 应用程序,我有以下代码在文本框中写入日志:

    public void RemoteInfo(string message)
    {
        textBox.Dispatcher.BeginInvoke(new Action(delegate ()
        {
            DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture) + " " + message + Environment.NewLine + textBox.Text;
        }));
    }

我从以下代码调用这个方法:

     Task.Run(() =>
        {
            while (true)
            {
                statusBarWriter.RemoteInfo("Some text");
                Thread.Sleep(100);
            }
        });

当这段代码运行时,CPU 使用率至少增加到 30%(在 30% 之后我停止程序以防止冻结)。

代码有什么问题,如何防止 CPU 使用率过高?

UPDATE第二个代码sn-p是最新的

【问题讨论】:

  • 您是否在无限循环中运行它?新任务的产生速度是否比更新文本框内容的速度快?更新时间会增加,因为您附加文本并且从不删除一些文本。
  • 你发布的代码不会造成30%的CPU使用率除非它被锤击,你怎么称呼它
  • 最好使用 DispatcherTimer,而不是使用 Sleep 进行无限循环。它的 Tick 事件在 UI 线程中触发,因此您无需调用 BeginInvoke。
  • 对不起,我粘贴了错误的第二个代码 sn-p,现在我更新它。我像 dlatikay 所说的那样在无限循环中运行代码。
  • 您正在从一个线程写入 UI 线程,这将导致大量上下文切换。使用“BeginInvoke”不是一个好的设计选择,因为它在后台使用了 SendMessage 的 PostMessage。因此,最好使用事件来通知 UI 线程的更改,

标签: c# .net wpf performance textbox


【解决方案1】:

改变写入方式后,CPU负载降低,现在约为0-1%:

    textBox.SelectionStart = 0;
    textBox.SelectionLength = 0;
    textBox.SelectedText = DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture) + " " + message + Environment.NewLine;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 2015-11-01
    • 1970-01-01
    • 2023-03-27
    • 2016-06-11
    • 1970-01-01
    相关资源
    最近更新 更多