Dans mon application, j'ai une méthode statique qui est appelée à partir de plusieurs threads en même temps. Y a-t-il un risque que mes données soient mélangées?
Lors de ma première tentative, la méthode n'était pas statique et je créais plusieurs instances de la classe. Dans ce cas, mes données se sont mélangées d'une manière ou d'une autre. Je ne sais pas comment cela se produit, car cela n'arrive que parfois. Je suis toujours en train de déboguer. Mais maintenant, la méthode est statique sur je n'ai pas de problèmes pour l'instant. C'est peut-être juste de la chance. Je ne sais pas avec certitude.
c#
multithreading
static
TalkingCode
la source
la source
Réponses:
Les variables déclarées à l'intérieur des méthodes (à l'exception possible des variables " capturées ") sont isolées, vous n'aurez donc aucun problème inhérent; cependant, si votre méthode statique accède à un état partagé, tous les paris sont désactivés.
Des exemples d'état partagé seraient:
Si vous avez un état partagé, vous devez soit:
whatever.SomeData
plusieurs reprises, vous lisezwhatever.SomeData
une fois dans une variable locale, puis utilisez simplement la variable - notez que cela n'aide que pour l'état immuable!)la source
Oui, c'est juste de la chance. ;)
Peu importe que la méthode soit statique ou non, ce qui compte, c'est si les données sont statiques ou non.
Si chaque thread a sa propre instance distincte de la classe avec son propre ensemble de données, il n'y a aucun risque que les données soient mélangées. Si les données sont statiques, il n'y a qu'un seul ensemble de données et tous les threads partagent les mêmes données, il n'y a donc aucun moyen de ne pas les mélanger.
Lorsque vos données dans des instances séparées sont toujours mélangées, c'est probablement parce que les données ne sont pas vraiment séparées.
la source
It doesn't matter if the method is static or not, what matters is if the data is static or not
. Juste pour ajouter, les variables locales déclarées dans le cadre d'une méthode statique ne font pas partie des données dont nous devons nous préoccuper dans le scénario donné.Les méthodes statiques devraient convenir à plusieurs threads.
Les données statiques, d'un autre côté, peuvent poser un problème car les tentatives d'accès aux mêmes données à partir de différents threads doivent être contrôlées pour s'assurer qu'un seul thread à la fois lit ou écrit les données.
la source
MSDN dit toujours:
Edit: Comme le disent les gars ici, ce n'est pas toujours le cas, et cela s'applique clairement aux classes conçues de cette manière dans la BCL, pas aux classes créées par l'utilisateur où cela ne s'applique pas.
la source