2010-05-18 9 views
2

C'est une question assez simple, et j'imagine que c'est le cas, mais je ne trouve pas de réponse définitive. Est-ce que SynchronizationContext.Post() threadsafe?SynchronizationContext.Post() threadsafe?

J'ai une variable membre qui contient le contexte du thread principal, et _context.Post() est appelée à partir de plusieurs threads. J'imagine que Post() pourrait être appelé simultanément sur l'objet. Dois-je faire quelque chose comme

lock (_contextLock) _context.Post(myDelegate, myEventArgs); 

ou est-ce inutile?

Edit: "membres d'instance ne sont pas garantis comme sûrs"
MSDN affirme que dois-je conserver mon lock(), alors?

Répondre

3

En ne respectant pas la documentation MSDN, la méthode SynchronizationContext.Post n'est pas sécurisée pour les threads. Donc, à moins d'une erreur dans la documentation, vous devrez synchroniser l'accès à la méthode. J'ai du mal à croire que ce n'est pas sûr pour les threads, mais vous ne pouvez pas miser sur des suppositions surtout quand il s'agit de problèmes de synchronisation de threads. Il n'y a vraiment aucun moyen de contourner cela jusqu'à ce que Microsoft corrige la documentation ou la rende vraiment sûre pour les threads.

+0

En regardant le code désassemblé, cette méthode appelle simplement ThreadPool.QueueUserWorkItem qui, selon msdn, est thread-safe. –

+1

@Phil: Ce n'est pas surprenant. Malheureusement, Microsoft s'est effectivement réservé le droit de modifier l'implémentation d'une manière qui annulerait son comportement thread-safe actuel dans une future version ou un service pack. Je suppose qu'ils ont vraiment l'intention pour cette classe d'avoir des méthodes d'instance thread-safe et qu'ils ont juste foiré la documentation. Mais, encore une fois, c'est juste une hypothèse. –

+0

Compte tenu de son utilisation, il serait stupide pour eux de le changer pour ne pas être thread safe! – RichardOD

1

SynchronizationContext.Post est threadsafe. La documentation a négligé ce fait.

Je fonde cette affirmation sur les implémentations de Microsoft de AsyncOperation et AsyncOperationManager, qui prennent SynchronizationContext.Post est threadsafe (y compris les implémentations dérivées).