我想学习在C#.NET中的并行编程(不是所有的知识,只是基础和一些良好实践),因此我决定重写一个叫做ImageSyncer的旧程序。ImageSyncer是一个非常简单的程序,它只是扫描一个文件夹并查找所有以.jpg结尾的文件,然后根据它们被拍摄的日期计算出文件的新位置(解析xif数据或者其他所称呼的数据)。当一个位置被生成时,程序会检查该位置是否已经有文件存在,如果有文件,则会比较要复制的文件和“挡路”的文件的最后写入时间。如果这些时间相等,则跳过该文件。如果不相等,则创建并匹配两个文件的md5校验和。如果没有匹配,则为要复制的文件提供新的位置(例如,如果要将其复制到“C:\test.jpg”,则将其复制到“C:\test(1).jpg”)。该操作的结果被填充到一个包含两个字符串的结构体类型的队列中,一个是原始文件名,一个是要复制到的位置。然后迭代该队列直到为空,并复制文件。
换句话说,该程序包括四个操作:
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完成后,步骤2就开始了。另一个模型(我认为更有趣,因为我不知道如何做)是创建一种工作者和消费者模型,这样当一个线程完成步骤1时,另一个线程接管并在该对象上执行步骤2(或类似于此)。但是,我不知道这些解决方案是否都可行。而且,我对并行编程并不是很了解。我知道如何创建线程,以及如何让它执行一个以对象为唯一参数的函数,并且我也曾经使用过BackgroundWorker类,但我对它们并不是那么熟悉。欢迎提供任何意见。