2009-11-20 7 views
0

Je souhaite exécuter trois threads (i) l'un doit ajouter des chaînes dans un fichier. (Ii) L'autre thread doit supprimer les caractères spéciaux du flux écrit (iii) Le troisième thread doit trier les mots dans l'ordre croissant. Comment pourrais-je le faire d'une manière sûre de fil (synchronisée)?Aide C# -Threading pour débutant

je veux dire

Fil 1

sample.txt 

Apple 
Ma#22ngo 
[email protected]&&pes 

Fil 2 (après élimination des caractères spéciaux sample.txt)

Apple 
Mango 
Grapes 

Fil 3 (sample.txt)

Apple 
Grapes 
Mango 
+5

Pourquoi voulez-vous des discussions? Cela ressemble à un thread pourrait prendre soin de tout ... Si vous avez 3 threads, ils doivent tous attendre les uns les autres ... – Zenuka

+1

Mec, c'est un mauvais exemple pour commencer à enfiler. Chaque thread va être verrouillé pendant que les autres travaillent avec le fichier. –

Répondre

5

Pourquoi voulez-vous faire cela en utilisant plusieurs threads? Peut-être que votre exemple a été simplifié à l'extrême, mais si vous pouvez éviter le threading, alors faites-le - et il semblerait que ce problème n'en a pas besoin.

Avez-vous beaucoup de fichiers, ou un très gros fichier, ou autre chose? Pourquoi ne pouvez-vous pas simplement exécuter les trois actions les unes après les autres?

MISE À JOUR

Je sentais que je devrais au moins essayer de vous aider à résoudre le problème sous-jacent, vous êtes confronté. Je pense que vous devez considérer la tâche que vous envisagez comme un pipeline. Vous commencez avec des chaînes, vous supprimez des caractères spéciaux (nettoyage), vous les écrivez dans un fichier. Quand vous avez finalement écrit toutes les chaînes dont vous avez besoin pour les trier.

Tout jusqu'à l'étape de tri peut, et devrait, être fait par un seul fil. Lire la chaîne, la nettoyer, l'écrire dans un fichier, passer à la chaîne suivante. La dernière tâche de tri ne peut pas se produire facilement tant que toutes les chaînes n'ont pas été écrites correctement dans le fichier.

Si vous avez beaucoup de fichiers à écrire et à trier, chacun d'eux peut être traité par un thread séparé, mais j'éviterais d'impliquer plusieurs threads dans le traitement d'un fichier donné.

2

Je voudrais effectuer les opérations 1 et 2 dans le même fil en supprimant les caractères spéciaux avant d'écrire dans le fichier. L'opération 3 ne peut pas être exécutée en parallèle avec d'autres car pendant l'écriture du fichier, vous ne pouvez pas le lire et le trier. Donc, fondamentalement, ces opérations sont séquentielles et cela n'a aucun sens de les mettre dans des threads séparés.

0

Vous devez implémenter une file d'attente ThredSafe (ou utiliser celle fournie avec les extensions Parallels). Les threads ont le problème du partage d'informations, même si théoriquement votre solution serait considérée comme un scénario parallèle parfait, la réalité est que vous ne pouvez pas laisser les threads accéder librement aux données partagées, parce que quand vous le faites, De mauvaises choses arrivent. A la place, vous pouvez utiliser un mécanisme de synchronisation, dans ce cas ConcurrentQueue. De cette façon, vous aurez ceci:

ConcurrentQueue<string> queueStrings; 
ConcurrentQueue<string> queueFile; 

Thread1 insère des chaînes dans la queue queueStrings. Thread2 lit les chaînes depuis la chaîne queueString, les traite, puis les insère dans la queue queueFile.Enfin, Thread3 lit les chaînes traitées à partir de queueFile et les écrit dans le fichier.

+0

vous voulez dire C# 4.0 ..? –

+0

Je travaille en C# 3.0 –

+0

Ouais, vous pouvez l'obtenir soit avec les extensions Parallels CTP ou la C# 4.0 ... ou l'implémenter vous même –