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? P>
5 Réponses :
"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 espère que cela aide! p> verrou code> ou trouver une autre façon de le faire. P>
deux points: p>
Je ne veux pas créer d'engourdissement à chaque fois que j'appelle la fonction analysante p> blockQuote>
Je ne pense pas que cela serait vraiment trop préoccupant -
cultureInfo code> s ne sera pas particulièrement grand, et comme pour la performance, les "intégrés" sont en fait Cached, donc tous un
nouveau code> est récupéré un objet existant. Par tout signifie profil et voir s'il s'agit d'un problème ... p>
Comment pourrais-je savoir si Tryparse utilise des membres d'instance de l'engurrence ou non? p> blockQuote>
Je serais extrêmement surpris de découvrir une méthode acceptée em> a
cultureInfo de code> puis a ensuite été sur changer em> 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. P>
Donc, je dirais avoir un
nouveau cultureinfo ("en-nous", false) code> et le transmettre - rien ne va muter, donc les problèmes multi-threading ne surgissent pas . p>
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 code> S est en lecture seule et, en tout état de cause, il existe une méthode
lisonly code>, une de ces approches devrait donc garantir sécurité.
Essayez d'utiliser http://msdn.microsoft.com/en-us/library/yck8b540.aspx p> ou rendre votre champ à être réveillé afin que vous n'ayez pas besoin d'une serrure: p> cultureinfo.getcultureInfo ("fr-US") code> qui "récupère une instance mise en cache, lecture seule d'une culture à l'aide du nom de culture spécifié."
cultureInfo.Readonly code> 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 .
Pour obtenir la sécurité de thread-Safety, vous pouvez créer une culture en lecture seule à l'aide de la statique cultureInfo.Readonly code>
Méthode:
Je ne trouve pas dans la documentation où un CultureInfo CODE> est en sécurité. Voir mon commentaire sur la réponse acceptée.
Vous pouvez définir le cultureInfo d'un thread spécifique avec 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. P> system.threading.thread.currentThread.currentculture = myci; code>
Donc, vous n'avez pas à passer à chaque fois que vous appelez une fonction. P>