11
votes

Sécurité du fil de cultureInfo

J'ai une application multi-threadé qui analyse du texte et qu'il doit utiliser des informations de culture anglaises pour analyse de numéros d'analyse de ce texte. Donc, je ne veux pas créer d'engourdissement à chaque fois que j'appelle la fonction analyse. Actuellement, je passe l'engourdissement comme un paramètre mais je ne suis pas content de cela. Je veux définir l'engurrence en tant que membre statique, il sera donc partagé par des threads.

Documentation MSDN indique que "Les membres publiques statiques (partagés visuels de base) de ce type sont en sécurité. N'importe quel instance Les membres ne sont pas garantis à être le fil sûr. " J'utilise simplement la fonction suivante, comment puis-je savoir si Tryparse utilise des membres d'instance de l'engourdissement ou non? xxx


0 commentaires

5 Réponses :


0
votes

"membres" signifie méthodes plus opérateurs plus champs plus les propriétés. Vous utilisez un membre d'instance et doit donc utiliser un verrou ou trouver une autre façon de le faire.

espère que cela aide!


0 commentaires

0
votes

deux points:

Je ne veux pas créer d'engourdissement à chaque fois que j'appelle la fonction analysante

Je ne pense pas que cela serait vraiment trop préoccupant - cultureInfo s ne sera pas particulièrement grand, et comme pour la performance, les "intégrés" sont en fait Cached, donc tous un nouveau est récupéré un objet existant. Par tout signifie profil et voir s'il s'agit d'un problème ...

Comment pourrais-je savoir si Tryparse utilise des membres d'instance de l'engurrence ou non?

Je serais extrêmement surpris de découvrir une méthode acceptée a cultureInfo puis a ensuite été sur changer que cultureInfo < / code> de quelque manière que ce soit. Bien qu'ils ne soient pas réellement formellement immuables, je les utiliserais (en particulier les «intégrés») comme s'ils étaient immuables, sans une seconde pensée.

Donc, je dirais avoir un nouveau cultureinfo ("en-nous", false) et le transmettre - rien ne va muter, donc les problèmes multi-threading ne surgissent pas .


2 commentaires

J'hésite que certains threads le mettront dans un état incohérent (au milieu de la lecture d'une liste, etc.), tandis qu'un autre essaie de le lire. Donc, si la lecture de ce n'était pas une grosse préoccupation, pourquoi ont-ils dit que ce n'est pas sûr d'utiliser des membres de l'instance.


@Lockedscope J'applaudis votre prudence. J'apprends d'autres réponses que le «Code intégré» cultureInfo S est en lecture seule et, en tout état de cause, il existe une méthode lisonly , une de ces approches devrait donc garantir sécurité.



6
votes

Essayez d'utiliser cultureinfo.getcultureInfo ("fr-US") qui "récupère une instance mise en cache, lecture seule d'une culture à l'aide du nom de culture spécifié."

http://msdn.microsoft.com/en-us/library/yck8b540.aspx

ou rendre votre champ à être réveillé afin que vous n'ayez pas besoin d'une serrure: xxx


2 commentaires

cultureInfo.Readonly subvention garantit des garanties de sécurité? Parce que lire -Son et threadsafe sont différents .


@ ta.speot.is: bonne question. J'étais curieux de ce moi-même et posi une question à ce sujet .



3
votes

Pour obtenir la sécurité de thread-Safety, vous pouvez créer une culture en lecture seule à l'aide de la statique cultureInfo.Readonly Méthode: xxx


1 commentaires

Je ne trouve pas dans la documentation où un CultureInfo est en sécurité. Voir mon commentaire sur la réponse acceptée.



1
votes

Vous pouvez définir le cultureInfo d'un thread spécifique avec system.threading.thread.currentThread.currentculture = myci; Donc, vous n'avez pas à passer à chaque fois que vous appelez une fonction.

Notez que juste accéder aux getters de plusieurs threads ne fera aucun préjudice dans la plupart des cas si vous ne modifiez pas l'objet.


0 commentaires