2017-06-05 9 views
1

je vois dans le XmlDocument class documentation sur MSDN"Les membres statiques publics de XmlDocument sont thread-safe Tous les membres d'instance ne sont pas garantis d'être thread-safe.": Oui, mais

Tout public static (Shared en Visual Basic) les membres de ce type sont thread-safe. Les membres d'instance ne sont pas garantis être thread safe.

Même chose pour la classe XmlNodeList. J'utilise ces classes dans le contexte suivant. A l'intérieur d'un Parallel.Foreach que je fais:

X MyX = new X(); 
string XMLstring = MyX.GetXML(ID, true); 
XmlDocument doc = new XmlDocument(); 
doc.LoadXml(XMLstring); 
XmlNodeList nodeList = doc.SelectNodes("blah/secondblah"); 

X est défini dans une bibliothèque informatique de la fournissent à moi et où ID est un int (à peu près sur laquelle boucle I).

Cela a été testé à fond dans un contexte non parallèle, les string s produits par GetXML sont en effet correct, le XmlDocument correspondant aussi bien, et « l'analyse syntaxique » via XmlNodeList fournit les résultats escomptés.

Maintenant, il ce contexte parallèle et en supposant que X et GetXML sont en effet thread-safe, le fait que je new un XmlDocument dans chaque boucle assure la sécurité des threads ou non? Je veux dire, comment puis-je savoir que le membre string (tout d'abord est-il une telle chaîne? Comme je ne vois aucune propriété string dans le document) de XmlDocument recevoir le LoadXml est static ou non?

Je suppose que je ne comprends pas vraiment le peu de documentation MSDN je cite ci-dessus ...

Répondre

2

La documentation signifie que toutes les méthodes qui sont statiques (qui ressemblerait XmlDocument.MethodCall sont thread-safe. Ce ISN « t pertinent pour vous -. vous n'êtes pas d'appeler une de ces d'autres méthodes (par exemple contre doc) ne sont pas statiques - donc ils ne sont pas garantis d'être thread-safe

Votre code sera 100% fin. , tant que doc (et nodeList et d'autres variables «non thread-safe») sont utilisés uniquement dans le con texte d'un seul fil.

Donc, si vous peuplaient docavant le Parallel.ForEach puis utilisé à l'intérieur doc le Parallel.ForEach - ça ne marchera pas.

Mais si vous enrichissez et utilisé à l'intérieur doc le Parallel.ForEach vous sera bien (puisque chaque fil aura sa propre doc'- ainsi thread-sécurité ne sera pas un problème). Pour être sûr à 100%, vous devez publier la méthode complète (y compris l'appel Parallel.ForEach) pour que nous puissions l'examiner.

+0

Je confirme que 'doc' (et' nodeList' et d'autres variables 'non-thread-safe') sont utilisés uniquement dans le contexte d'un seul thread. A propos du document: Je ne vois que des "membres", pas des "méthodes". Je suis assez nouveau à 'C#', donc j'ai manqué un point de vocabulaire ou? –

+0

"Membres" inclut les méthodes (code) et les propriétés (données). – Polyfun

+0

Dans le contexte de cette question, les membres et les méthodes sont équivalents. Toutes mes excuses pour avoir changé la terminologie sur vous. – mjwills

1

Oui, il est thread-safe. Vous ne partagez rien entre les threads. J'ai utilisé un code XmlDocument similaire dans de grandes applications multithread sans problèmes.En théorie, il pourrait y avoir des données statiques privées dans XmlDocument que nous ne connaissons pas sur ce qui n'est pas thread-safe, mais mon expérience est que ce n'est pas le cas. Je pense que la documentation MSDN implique que Microsoft s'est assuré que tout contenu statique qui peut être partagé à travers les threads, est en fait thread sécurisé.

+0

Oui, "il pourrait y avoir des données statiques privées dans XmlDocument que nous ne savons pas sur ce qui n'est pas thread-safe" était exactement mon point de vue. –

+0

Alors que @mjwills a répondu avant vous, j'accepterai sa réponse, mais la vôtre me revient! Merci beaucoup. –