[ThreadStatic]
est défini à l'aide de l'attribut tandis que ThreadLocal<T>
utilise générique. Pourquoi différentes solutions de conception ont-elles été choisies? Quels sont les avantages et les inconvénients de l'utilisation des attributs génériques dans ce cas?
c#
generics
attributes
thread-local
threadstatic
user2341923
la source
la source
Réponses:
Ce que l'article de blog noté dans les commentaires ne rend pas explicite, mais je trouve très important, c'est que cela
[ThreadStatic]
n'initialise pas automatiquement les choses pour chaque fil. Par exemple, disons que vous avez ceci:Le premier thread qui l'utilise verra
Foo
initialisé à42
. Mais les fils suivants ne le seront pas. L'initialiseur fonctionne uniquement pour le premier thread. Vous finissez donc par devoir écrire du code pour vérifier s'il est initialisé.ThreadLocal<T>
résout ce problème en vous permettant de fournir une fonction d'initialisation (comme le montre le blog de Reed) qui est exécutée avant le premier accès à l'élément.À mon avis, il n'y a aucun avantage à utiliser
[ThreadStatic]
au lieu deThreadLocal<T>
.la source
ThreadLocal<T>
c'est disponible dans .NET 4 et plus, et l'ThreadStatic
attribut est également disponible dans 3.5 et ci-dessous.ThreadLocal<T>
implémenteIDisposable
et vous oblige généralement à implémenterIDisposable
également, ce qui oblige vos appelants à vous éliminer et donc à implémenterIDisposable
également ...ThreadLocal
ouThreadStatic
avec des threads de pool. Ces valeurs resteront pendant toute la durée de vie du thread de pool, pas seulement pour la tâche que vous lui attribuez. Cela peut vous causer des problèmes de manière assez peu évidente. Voir stackoverflow.com/questions/561518/… et des questions similaires pour plus d'informations.static
? Voir msdn.microsoft.com/en-us/library/…ThreadStatic Initialize uniquement sur le premier thread, ThreadLocal Initialize pour chaque thread. Voici la démonstration simple:
la source
L'idée principale derrière ThreadStatic est de conserver une copie séparée de la variable pour chaque thread .
Dans l'extrait de code ci-dessus, nous avons une copie distincte de
value
pour chaque thread, y compris le thread principal.Ainsi, une variable ThreadStatic sera initialisée à sa valeur par défaut sur d'autres threads à l'exception du thread sur lequel elle est créée.
Si nous voulons initialiser la variable sur chaque thread à notre manière, utilisez ThreadLocal.
la source