【发布时间】:2011-07-27 20:18:35
【问题描述】:
我有一个 WinForms 数据输入表单,其中包含超过 1500 个问题。我将问题分成几个部分,每个部分都有未知数量的问题。每个部分都是自己的用户控件,并为每个问题动态创建和添加行(2 个面板、2 个标签、一个文本框和另一个用户控件)。然后将部分控件添加到表单中。
我的问题是该过程需要很多时间,即使使用 TPL(任务并行库)也是如此。我最终希望创建/添加控件并允许用户同时开始输入数据。控件将进入可滚动面板。当用户输入数据时,这些数据需要在本地数据库中处理……因此可能需要更多线程。
我尝试过使用 TPL,我是新手,在处理过程中将所有控件添加到列表中,然后在 Parallel.ForEach 完成后排序并添加到表单中...大约需要 20 秒超过 1200 个问题。
我还尝试使用BackgroundWorker 组件。使用 BWC 似乎是两者中较快的,但 ProgressChanged() 事件处理程序存在竞争条件,并且并非所有控件都被添加......更不用说表单在所有重新呈现时的外观。
我只是用错了 TPL 吗?解决这个问题的最佳方法是什么?还有其他方法还是我只是让用户等待?
谢谢
【问题讨论】:
-
这与线程无关。当您拥有这么多控件时,只需绘制表单就需要很长时间。它太大了,超过 10 倍。
-
@Hans Passant:是的,我同意表格太大。不幸的是,这是我无法控制的。
-
这将导致项目灾难。至少让利益相关者知道他会期待什么。 “不是我的问题”的态度不会让任何人开心,它会成为你的问题。
-
@Hans Passant:我从来没有说过我采取“不是我的问题”的态度。每个人都充分意识到这个问题,这不是一个好的做法。如您所见,这已经是我的问题了。
标签: winforms multithreading c#-4.0 task-parallel-library