В общем, вы должны оставить это до определенной библиотеки классов пользовательского интерфейса, чтобы установить это правильно. Winforms автоматически устанавливает экземпляр WindowsFormsSynchronizationContext, WPF устанавливает DispatcherSynchronizationContext, ASP.NET устанавливает AspNetSynchronizationContext, приложение Store устанавливает WinRTSynchronizationContext и так далее. Высокоспециализированные поставщики синхронизации, настроенные на то, как поток пользовательского интерфейса отправляет события.
Есть что-то особенное в том, как эти прикладные среды используют свой основной поток. Все они реализуют диспетчерский цикл и используют потокобезопасную очередь для получения уведомлений. Обычно известный как «цикл сообщений» в программировании Windows GUI. Это общее решение проблемы производителя / потребителя с циклом диспетчера, реализующим потребителя.
Для создания собственного поставщика синхронизации для рабочего потока сначала необходимо, чтобы такой поток реализовывал тот же механизм. Другими словами, вам понадобится потокобезопасная очередь, такая как ConcurrentQueue, и поток должен быть записан для извлечения уведомлений из очереди и их выполнения. Объект делегата был бы хорошим выбором. Теперь у вас не возникнет проблем с реализацией метода Post, просто добавьте делегата SendOrPostCallback в очередь. Для реализации метода Send требуется дополнительная работа, поток должен сообщить, что делегат был получен и выполнен. Таким образом, объект очереди также нуждается в AutoResetEvent.
Обратите внимание, что ваш поток перестает становиться обычно полезным потоком, он застрял из-за необходимости отправлять эти уведомления. И как существующие поставщики синхронизации уже делают все это. Поэтому, если ваше приложение является приложением Winforms, вы можете также вызвать Application.Run () в своем рабочем потоке с фиктивной невидимой формой. И вы автоматически получите его провайдер синхронизации бесплатно.