我正在运行一个经常显示大量统计数据和图表的 C# winform 应用程序。这个应用程序由多个表单组成,每个表单都有不同的输出。当我打开任务管理器查看cpu使用情况时,发现我的8个核心中只有一个核心超载,其余的什么都不做!例如,有没有办法将每个表格数量分配给一个核心。我需要提高性能。
我正在寻找的是对我的winforms进行多线程处理,以便每个表单都有一个在不同核心上运行的不同线程。那可能吗 ?
瓶颈发生在将数据加载到控件中。
我正在运行一个经常显示大量统计数据和图表的 C# winform 应用程序。这个应用程序由多个表单组成,每个表单都有不同的输出。当我打开任务管理器查看cpu使用情况时,发现我的8个核心中只有一个核心超载,其余的什么都不做!例如,有没有办法将每个表格数量分配给一个核心。我需要提高性能。
我正在寻找的是对我的winforms进行多线程处理,以便每个表单都有一个在不同核心上运行的不同线程。那可能吗 ?
瓶颈发生在将数据加载到控件中。
在单个 WinForms 应用程序中可以有多个 UI 线程。每个 UI 线程必须调用 Application.Run() 并且您需要使用 [STAThread] 标记每个的入口点,就像您在 Main 函数中所做的那样。
我已经成功地做到了这一点,当面对在其 UI 线程上做太多工作的现有代码库时,这是一种合理的方法。但是......我会说这是可以通过其他方式改进的设计的症状。如果您在 UI 线程上做太多工作,请考虑在其他线程上完成该工作的方法。在我的应用程序中,我尝试在非 UI 线程上完成所有重要的工作。它可以做到,但它并不总是交付软件的最快方式。
如果不做任何其他工作,单个 UI 线程就足以绘制 8 个充满数字和图表的屏幕,并且更新它们的频率超出了人类可以跟上的频率。我知道是这样的:-)
这在技术上是可行的,在 WPF 中比在 WinForms 中更灵活(根据我的经验),但两者都不推荐。Windows 客户端应用程序倾向于使用负责绘制 UI 的单个线程运行;通常后台线程用于数据访问或业务逻辑的后台处理。此外,您必须在 UI 中做大量工作才能使渲染性能成为真正的问题——这对我来说听起来像是不必要的工作。
但是,WinForms 中的基本样式是这样的:
var t = new Thread(() =>
{
var f = new Form1();
Application.Run(f);
})
t.Start();
您需要注意的事项:
Invoke
在表单之间调用以确保它们位于正确的线程上。如果您需要/想要,请始终在单独的线程或多个线程上进行数据处理、从 I/O 接收、解析等。
然后,如果您将大量数据加载到 UI 控件,请确保不要过于频繁地与 UI 线程同步,例如,如果您分别从输入流中调用每个项目并且每秒有数千个这样的项目 - WinForms将停止。
在后台线程中排队视觉数据更改,并以最小间隔将它们批处理到 UI 线程,以免过于频繁地执行此操作 - 线程同步很昂贵。AddRange 是您的朋友。