Programação paralela em C #

Estou interessado em aprender sobre programação paralela no C # .NET (não como tudo o que há para saber, mas o básico e talvez algumas boas práticas); portanto, decidi reprogramar um programa antigo chamado ImageSyncer. O ImageSyncer é um programa realmente simples, basta digitalizar através de uma pasta e encontrar todos os arquivos que terminam com .jpg. Depois, calcula a nova posição dos arquivos com base na data em que foram tirados (análise de dados xif ou qualquer outra coisa). é chamado). Depois que um local é gerado, o programa verifica se há arquivos existentes nesse local e, se existir, ele analisa a última hora de gravação do arquivo a ser copiado e do arquivo "a caminho". Se esses forem iguais, o arquivo será ignorado. Caso contrário, uma soma de verificação md5 dos dois arquivos será criada e correspondida. Se não houver correspondência, o arquivo a ser copiado recebe um novo local a ser copiado (por exemplo, se for copiado para "C: \ test.jpg", ele será copiado para "C: \ test (1). jpg "). O resultado desta operação é preenchido em uma fila de um tipo de estrutura que contém duas cadeias, o arquivo original e a posição para a qual copiar. Em seguida, essa fila é iterada até ficar vazia e os arquivos serem copiados.

Em outras palavras, existem 4 operações:

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

E, por isso, quero reescrever esse programa para torná-lo paralelo e poder executar várias operações ao mesmo tempo, e fiquei imaginando qual seria a melhor maneira de conseguir isso. Eu criei dois modelos diferentes em que consigo pensar, mas nenhum deles pode ser bom. O primeiro é paralelizar as 4 etapas do programa antigo, para que, quando a etapa 1 for executada, ela seja executada em vários threads, e quando toda a etapa 1 for concluída, a etapa 2 seja iniciada. O outro (que acho mais interessante porque não tenho idéia de como fazer isso) é criar um tipo de modelo de trabalhador e consumidor; portanto, quando um encadeamento é concluído na etapa 1, outro assume e executa a etapa 2 nesse ponto. objeto (ou algo parecido). Mas, como dito, não sei se alguma dessas são boas soluções. Além disso, não sei muito sobre programação paralela. Eu sei como criar um thread, e como fazê-lo executar uma função, recebendo um objeto como seu único parâmetro, e também usei a classe BackgroundWorker em uma ocasião, mas não estou familiarizado com nenhum deles. .

Qualquer entrada seria apreciada.

questionAnswers(3)

yourAnswerToTheQuestion