【发布时间】: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