我刚刚完成了迄今为止最复杂和功能最丰富的WinForms应用程序。它加载一个列表(任意数量的HTML文件),然后加载一个文件的内容,使用一些RegEx匹配一些标记并删除或替换它们(是的,是的,我见过这 )。非常好,谢谢Cthulu),然后把它写到磁盘上。
然而,我注意到大约200个文件需要大约30秒的时间来处理,在前5-10秒之后,程序被报告为“没有响应”。我认为这样做是不明智的,因为硬盘驱动器是一个瓶颈。
也许可以将尽可能多的内容加载到内存中,然后用线程处理每个线程,编写这些线程,然后再将更多的线程加载到内存中?
至少,创建一个与UI线程分离的工作线程是否可以防止“未响应”问题?(这篇MSDN文章涵盖了我正在考虑的内容。)
我想我是在问多线程是否能提高速度,如果是的话,最好的方法是什么呢?
任何帮助或建议都是非常感谢的!
发布于 2011-06-08 14:08:59
是的,您应该首先使用背景工作者将您的工作与GUI分离开来。处理GUI事件不应该花费太多时间。目标是20毫秒,而不是20毫秒。
然后,作为奖励,您可以看到处理(CPU密集型部分)是否可以分割成独立的作业,并作为TPL任务执行它们。
没有足够的信息来说明你是否应该或者如何去做。
发布于 2011-06-08 14:08:56
在大多数情况下,线程作业、任务等将防止主线程或主线程变得没有响应性。不要为磁盘IO创建多个线程(很明显)。我会将单个工作线程用于从队列中取出文件并处理磁盘IO。否则,一个或两个工作线程进行内存中的处理应该是足够的,而您的主线程可以保持响应。
发布于 2011-06-08 14:11:55
首先,如果您希望程序保持响应性,请将计算移到单独的线程(从UI线程中删除它)。
实际性能的提高取决于您拥有的处理器数量,而不是线程数。
因此,如果您有P线程,则可以将工作划分为P工作项,并获得一些工作改进。(Amdahl定律)
您可以使用BackgroundWorker正确地划分工作。:C# BackgroundWorker教程
https://stackoverflow.com/questions/6279948
复制相似问题