2

我正在运行一个经常显示大量统计数据和图表的 C# winform 应用程序。这个应用程序由多个表单组成,每个表单都有不同的输出。当我打开任务管理器查看cpu使用情况时,发现我的8个核心中只有一个核心超载,其余的什么都不做!例如,有没有办法将每个表格数量分配给一个核心。我需要提高性能。

我正在寻找的是对我的winforms进行多线程处理,以便每个表单都有一个在不同核心上运行的不同线程。那可能吗 ?

瓶颈发生在将数据加载到控件中。

4

3 回答 3

2

在单个 WinForms 应用程序中可以有多个 UI 线程。每个 UI 线程必须调用 Application.Run() 并且您需要使用 [STAThread] 标记每个的入口点,就像您在 Main 函数中所做的那样。

我已经成功地做到了这一点,当面对在其 UI 线程上做太多工作的现有代码库时,这是一种合理的方法。但是......我会说这是可以通过其他方式改进的设计的症状。如果您在 UI 线程上做太多工作,请考虑在其他线程上完成该工作的方法。在我的应用程序中,我尝试在非 UI 线程上完成所有重要的工作。它可以做到,但它并不总是交付软件的最快方式。

如果不做任何其他工作,单个 UI 线程就足以绘制 8 个充满数字和图表的屏幕,并且更新它们的频率超出了人类可以跟上的频率。我知道是这样的:-)

于 2012-10-23T13:47:44.223 回答
0

这在技术上是可行的,在 WPF 中比在 WinForms 中更灵活(根据我的经验),但两者都不推荐。Windows 客户端应用程序倾向于使用负责绘制 UI 的单个线程运行;通常后台线程用于数据访问或业务逻辑的后台处理。此外,您必须在 UI 中做大量工作才能使渲染性能成为真正的问题——这对我来说听起来像是不必要的工作。

但是,WinForms 中的基本样式是这样的:

var t = new Thread(() =>
        {
            var f = new Form1();
            Application.Run(f);
        })
t.Start();

您需要注意的事项:

  • 您将始终必须Invoke在表单之间调用以确保它们位于正确的线程上。
  • 如果您的业务层中有任何东西具有线程亲和性,那么每个使用它的表单都需要一个实例。
  • 应用程序关闭通常发生在响应主线程的表单关闭时。您可能需要手动处理关闭,尽管使用上面的代码,您有两个消息循环正在运行,并且当另一个表单关闭时,其中一个将使应用程序保持活动状态。
于 2012-10-23T13:49:27.077 回答
0

如果您需要/想要,请始终在单独的线程或多个线程上进行数据处理、从 I/O 接收、解析等。

然后,如果您将大量数据加载到 UI 控件,请确保不要过于频繁地与 UI 线程同步,例如,如果您分别从输入流中调用每个项目并且每秒有数千个这样的项目 - WinForms将停止。

在后台线程中排队视觉数据更改,并以最小间隔将它们批处理到 UI 线程,以免过于频繁地执行此操作 - 线程同步很昂贵。AddRange 是您的朋友。

于 2012-10-23T13:50:35.073 回答