使用多个线程会加速我的HTML文件处理应用程序吗?

时间:2011-06-08 14:02:16

标签: c# winforms multithreading

我刚刚完成了迄今为止最复杂,功能最强大的 WinForms 应用程序。它加载任意数量的HTML文件列表,然后加载一个内容,使用一些RegEx匹配一些标签并删除或替换它们(是的,是的,我看过this。它工作得很好,谢谢Cthulu),然后将其写入磁盘。

然而,我注意到大约200个文件需要大约30秒才能处理,并且在前5-10秒后,程序被报告为“无响应”。我认为做this guy did之类的事情并不明智,因为硬盘驱动器是瓶颈。

也许有可能将尽可能多的内容加载到内存中,然后用线程处理每个内核,编写那些内容,然后将更多内容加载到内存中?

至少,创建一个与UI线程分开的工作线程会阻止“无响应”问题吗? (This MSDN article covers what I was considering.

我想我在问多线程是否会提供任何速度提升,如果是这样,那么最好的方法是什么呢?

非常感谢任何帮助或建议!

5 个答案:

答案 0 :(得分:3)

是的,您应该首先使用Backgroundworker将您的工作与GUI分离。处理GUI事件不应该花费太多时间。目标是20ms,而不是20s。

然后作为奖励,您可以看到处理(CPU密集型部分)是否可以拆分为独立作业并将其作为TPL任务执行。

没有足够的信息说明您应该如何或如何做到这一点。

答案 1 :(得分:2)

在大多数情况下,线程作业,任务等将阻止主线程或主线程变得无响应。不要为磁盘IO创建多个线程(显然)。我将专门用一个工作线程将您的文件从队列中取出并处理磁盘IO。否则,在主线程可以保持响应的情况下,1或2个工作线程进行内存处理就足够了。

答案 2 :(得分:2)

首先,如果您希望程序保持响应,请将计算移动到单独的线程(将其从UI线程中删除)。

实际的性能提升取决于您拥有的处理器数量,而不是线程数。

因此,如果您有 P 主题,则可以将工作分为 P 工作项,并获得一些改进工作。 (Amdahl's Law

您可以使用BackgroundWorker正确划分工作。 :C# BackgroundWorker Tutorial

答案 3 :(得分:0)

为什么不使用StreamReader.ReadAllLines()将每个文件读入一个数组,然后处理该数组的每个元素?

答案 4 :(得分:-1)

如果您在GUI线程中进行所有处理,那么如果需要很长时间,您的应用程序将显示“无响应”。在我看来,你应该尝试永远不要在与GUI相同的线程中进行(广泛的)处理操作。 此外,您甚至可以为每个要处理的文件创建一个线程。只要单独的线程不需要彼此的任何数据,这将使大多数人加快速度。