2010-06-23 11 views
2

J'ai un tableau qui est une liste de fichiers dans un dossier, je suis en train de traiter les fichiers et de les renommer. Il faut environ 15 minutes pour les renommer tous, cela se fait tous les jours. J'ai actuellement 1 Backgroundworker pour gérer cela et mettre à jour l'interface utilisateur.Une seule tâche traitée par plusieurs arrière-planeurs?

Ma question est, ceci: Comment puis-je utiliser plus de 1 Backgroundworker pour utiliser plus de 25% de la CPU pour faire cela?

Diviser le tableau en 3 parties et appeler 3 travailleurs distincts pour faire leur part?

+0

Vous avez à peu près répondu à votre propre question. –

+0

Vous pouvez également utiliser une file d'attente partagée * safe-safe * et demander à chaque worker d'en tirer (jusqu'à ce qu'il soit vide, ce qui est la condition de fin). C'est l'approche que j'utilise habituellement. –

Répondre

3

Si vous utilisez .NET 4.0, vous pouvez utiliser des extensions parallèles qui fera efficacement pour vous - vous voulez simplement appeler

Parallel.ForEach(files, file => 
{ 
    // Call file processor here 
}); 

Notez que si votre tâche est fortement liée IO, en utilisant plusieurs les threads peuvent ralentir au lieu de l'accélérer.

+0

C'est une application de 3,5, mais il n'y a aucune raison pour laquelle elle ne peut pas être mise à niveau vers la version 4.0, je vais y réfléchir, merci beaucoup pour votre contribution. – Landmine

1

Vous pouvez créer une classe de travail qui accepte un chemin de dossier dans le constructeur. Cette classe de travailleurs est responsable de renommer tous les fichiers dans le contexte du dossier avec lequel elle est initialisée. La classe pourrait avoir une méthode DoWork() où tout votre travail de renommage se produirait. Cela vous permettra de créer une classe de travailleurs par dossier, puis de démarrer chaque classe de travailleurs sur un fil séparé, ce qui divisera le travail comme vous le souhaitez. Régler la priorité du fil plus haut vous donnera plus de temps sur le cpu.

L'espace de noms System.Threading contient ce dont vous avez besoin.

public class worker 
{ 
    private string _folderPath = string.Empty; 

    public worker(string folderPath) 
    { 
    _folderPath = folderPath 
    } 

    public void DoWork() 
    { 
    //work happens here 
    } 
} 


worker fileWorker = new worker("path to file folder"); 
Thread newThread = new Thread(fileWorker.DoWork); 
newThred.Start(); 

Profitez-en!

+0

Merci Doug, cependant, tous ces fichiers sont dans 1 dossier ... C'est un dossier de téléchargement qui est juste rempli! – Landmine

0

S'il y a peu de variabilité dans le temps pour traiter chaque article, alors diviser la matrice et donner une portion à chaque travailleur peut être acceptable. Cependant, vous trouverez peut-être mieux de garder la liste centralisée et de demander à chaque travailleur de «me donner du travail», ce qui devrait assurer que le travail est réparti de façon plus égale. Il résiste également à une population de travailleurs plus variable, les travailleurs peuvent aller et venir selon les ressources du système.