9
votes

Fil Safe Streamwriter C # Comment le faire? 2

C'est donc une continuation de ma dernière question - alors la question était donc "Quel est le meilleur moyen de créer un programme en sécurité en termes qu'il doit écrire une double valeur dans un fichier. Si la fonction qui enregistre les valeurs via StreamWriter est appelée par plusieurs threads? Quelle est la meilleure façon de le faire ? "

Et j'ai modifié un code trouvé chez MSDN, que diriez-vous de ce qui suit? Celui-ci écrit correctement tout dans le fichier. xxx


0 commentaires

4 Réponses :


2
votes

Le code que vous avez là est subtilement brisé - en particulier, si l'élément de travail en file d'attente fonctionne en premier, il affleurera immédiatement la liste (vide) de la valeur (vide), avant de terminer, après quoi votre travailleur va et remplit la liste. (qui finira par être ignoré). L'événement de réinitialisation automatique ne fait pas non plus rien, car rien ne se soumet ou n'attend jamais son état.

Également, puisque chaque thread utilise un verrou différent , les verrous n'ont aucune signification! Vous devez vous assurer de détenir une seule serrure partagée chaque fois que vous accédez au Streamwriter. Vous n'avez pas besoin d'un verrou entre le code de rinçage et le code de génération; Il vous suffit de vous assurer que la flush passe après la finition de la génération.

Vous êtes probablement sur la bonne voie, cependant, bien que j'utilise un tableau de taille fixe au lieu d'une liste et affleurez toutes les entrées de la matrice lorsqu'elle est complète. Cela évite la possibilité de manquer de mémoire si le fil est de longue durée.


2 commentaires

Comment se fait-il que le rinçage se produira si la liste est vide?


J'ai expliqué cela dans ma réponse - l'élément de travail en file d'attente WorkMethod peut exécuter avant le fil threadmethod . Et cela peut également fonctionner après. Vous ne pouvez pas prédire lequel, parce que vous n'avez défini aucune sorte de commande explicite ici.




7
votes

0 commentaires

4
votes

Vous dites donc que vous voulez que vous souhaitiez un tas de threads d'écrire des données sur un seul fichier à l'aide d'un streamwriter? Facile. Il suffit de verrouiller l'objet StreamWriter.

Le code ici créera 5 threads. Chaque thread effectuera 5 "actions" et à la fin de chaque action, il écrira 5 lignes sur un fichier nommé "fichier". xxx

Le résultat doit être un fichier. "Fichier" avec 125 lignes dedans avec toutes les "actions" effectuées simultanément et le résultat de chaque action écrite de manière synchrone au fichier.


3 commentaires

Vous ne devriez pas vous bloquer des objets dans lesquels vous ne contrôlez pas leur implémentation comme celle-ci - que si elle se verrouille en interne dans un autre fil? - Vous devez créer un nouvel objet à utiliser comme verrouillage.


N'utilisez pas un objet séparé pour un verrou. Verrouiller un objet directement est le seul moyen de s'assurer que tous les threads pouvant voir qu'un objet peuvent obtenir une serrure exclusive sur l'objet.


@Lunatisxperimentalist: Le verrouillage d'un objet directement ne garantit pas que toutes les threads obtiennent une serrure exclusive. Si un développeur oublie de verrouiller l'objet dans un endroit particulier, il a un accès incontrôlé, quel que soit votre objet tous les autres threads utilisent pour le verrouillage.