Является ли SynchronizationContext.Post () потокобезопасным? - PullRequest
2 голосов
/ 18 мая 2010

Это довольно простой вопрос, и я думаю, что это так, но я не могу найти однозначного ответа. SynchronizationContext.Post() потокобезопасен?

У меня есть переменная-член, которая содержит контекст основного потока, и _context.Post() вызывается из нескольких потоков. Я представляю, что Post() может быть вызвано одновременно на объекте. Должен ли я сделать что-то вроде

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

или это не нужно?

Edit:
MSDN утверждает, что " Любые члены экземпляра не гарантированно являются потокобезопасными. " Должен ли я сохранить свой lock(), тогда?

Ответы [ 2 ]

3 голосов
/ 18 мая 2010

Если строго следовать документации MSDN, то нет, метод SynchronizationContext.Post не является поточно-ориентированным. Поэтому, если в документации нет ошибок, вам нужно будет синхронизировать доступ к методу. Мне трудно поверить, что он сам по себе не является потокобезопасным, но вы не можете полагаться на предположения, особенно когда речь идет о проблемах синхронизации потоков. Это действительно невозможно, пока Microsoft не исправит документацию или не сделает ее поточно-ориентированной.

2 голосов
/ 19 мая 2010

SynchronizationContext.Post является потокобезопасным. Документация игнорирует этот факт.

Я основываю это утверждение на реализациях Microsoft AsyncOperation и AsyncOperationManager, в которых предполагается, что SynchronizationContext.Post является потокобезопасным (включая любые производные реализации).

...