【发布时间】:2010-02-15 02:44:09
【问题描述】:
我有兴趣学习 C#.NET 中的并行编程(不像所有要知道的东西,而是基础知识和一些好的实践),因此我决定重新编程我的一个旧程序,它是称为 ImageSyncer。 ImageSyncer 是一个非常简单的程序,它所做的只是扫描一个文件夹并找到所有以 .jpg 结尾的文件,然后它根据文件的拍摄日期计算文件的新位置(解析 xif 数据或其他它被称为)。生成位置后,程序会检查该位置是否存在任何现有文件,如果存在,它会查看要复制的文件和“以它的方式”文件的最后写入时间。如果它们相等,则跳过文件。如果不是,则创建并匹配两个文件的 md5 校验和。如果不匹配,则为要复制的文件指定要复制到的新位置(例如,如果要复制到“C:\test.jpg”,则将其复制到“C:\test(1).jpg”。 jpg”代替)。此操作的结果被填充到一个结构类型的队列中,该队列包含两个字符串,即原始文件和将其复制到的位置。然后迭代该队列,直到它为空并复制文件。
也就是说有4个操作:
1. Scan directory for jpegs
2. Parse files for xif and generate copy-location
3. Check for file existence and if needed generate new path
4. Copy files
所以我想重写这个程序以使其并行并能够同时执行多个操作,我想知道实现这一目标的最佳方法是什么。我想出了我能想到的两种不同的模型,但它们中的任何一种都可能根本没有任何好处。第一个是将旧程序的 4 个步骤并行化,以便在执行步骤 1 时在多个线程上完成,当整个步骤 1 完成时,开始步骤 2。另一个(我觉得更有趣,因为我不知道该怎么做)是创建一种工作者和消费者模型,所以当一个线程完成第 1 步时,另一个线程接管并执行第 2 步对象(或类似的东西)。但正如所说,我不知道这些是否有任何好的解决方案。另外,我对并行编程一无所知。我知道如何创建一个线程,以及如何让它执行一个以对象为唯一参数的函数,并且我也曾经使用过 BackgroundWorker 类,但我对它们中的任何一个都不熟悉.
我们将不胜感激。
【问题讨论】:
-
这听起来像是一个有趣的任务,但由于它可能是 IO 绑定的,多个线程都在磁盘上敲打很可能会使程序运行 比 if 慢你只用了一个线程。
-
谢谢,我没有真正考虑过这个。但我认为至少第 2 步和第 3 步可以从使用多个线程中受益,您不同意吗?
-
messagingbus.codeplex.com 可能会有所帮助
标签: c# .net parallel-processing