C# 使用多线程会加快我的HTML文件处理应用程序的速度吗?

C# 使用多线程会加快我的HTML文件处理应用程序的速度吗?,c#,winforms,multithreading,C#,Winforms,Multithreading,我刚刚完成了迄今为止最复杂、功能最丰富的WinForms应用程序。它加载任意数量的HTML文件列表,然后加载其中一个文件的内容,使用一些正则表达式匹配一些标记并删除或替换它们(是的,是的,我看到了。它工作得很好,谢谢Cthulu),然后将其写入磁盘 然而,我注意到大约200个文件需要30秒来处理,在最初的5-10秒后,程序被报告为“没有响应”。我认为这样做是不明智的,因为硬盘是一个瓶颈 也许有可能将尽可能多的数据加载到内存中,然后用一个线程处理每一个数据,写入这些数据,然后将更多的数据加载到内存

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

然而,我注意到大约200个文件需要30秒来处理,在最初的5-10秒后,程序被报告为“没有响应”。我认为这样做是不明智的,因为硬盘是一个瓶颈

也许有可能将尽可能多的数据加载到内存中,然后用一个线程处理每一个数据,写入这些数据,然后将更多的数据加载到内存中

至少,创建一个与UI线程分离的工作线程会防止“无响应”问题吗?()

我想我是在问多线程是否能提供任何形式的速度提升,如果是,那么最好的方法是什么


非常感谢您的任何帮助或建议

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

如果您在GUI线程中执行所有处理,应用程序将显示“未响应”,如果需要很长时间。在我看来,您应该尽量不要在与GUI相同的线程中执行(广泛的)处理操作。
此外,您甚至可以为每个要处理的文件创建一个线程。这很可能会加快速度,只要分离的线程不需要彼此之间的任何数据。

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

是的,您应该从使用Backgroundworker将工作与GUI分离开始。处理GUI事件不应花费太多时间。目标是20毫秒,而不是20秒

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


没有足够的信息说明您是否应该这样做或如何这样做。

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

实际性能的提高取决于处理器的数量,而不是线程的数量

因此,如果您有p线程,您可以将工作划分为p工作项,并获得一些工作改进。()


您可以使用BackgroundWorker正确划分工作:

@Henk Holterman我向你道歉,WinForms。我将编辑问题以反映这一点。我目前正在使用StreamReader.ReadToEnd()将文件内容读入单个字符串。您是否认为我应该创建几个线程,并让每个线程处理上述数组的单个元素?如何同步将更正后的元素写入磁盘?我在MSDN文章中读到了20ms规则。这是我第一次编写需要这么长时间的应用程序,所以后台工作人员的概念对我来说是全新的。我将研究第三方物流,这听起来确实很棒。谢谢看看,尤其是if/else if/。。。在已完成的事件中。我不知道BackgroundWorker甚至存在,谢谢你的链接!我一定会按照这条思路做一些事情。谢谢如果我要为每个文件创建一个线程,那么磁盘I/O操作会降低它们的速度。但无论如何,只需运行单线程就行了?