Прежде всего обратите внимание, что этот вопрос не помечен тегом winforms или wpf или любым другим, специфичным для графического интерфейса пользователя . Как вы вскоре увидите, это сделано намеренно.
Во-вторых, извините, если вопрос слишком длинный. Я пытаюсь собрать воедино различные фрагменты информации, плавающие здесь и там, чтобы также предоставить ценную информацию. Однако мой вопрос находится прямо в разделе «Что я хотел бы знать».
Моя миссия - наконец понять различные способы, предлагаемые .NET для вызова делегата в конкретном потоке.
Что хотелось бы знать:
Я ищу наиболее общий способ (не зависящий от Winforms или WPF) для вызова делегатов в определенных потоках.
Или, иначе говоря: мне было бы интересно, используют ли и как различные способы сделать это (например, через
Dispatcher
WPF) друг друга; то есть, если есть один общий механизм для вызова делегата между потоками, который используется всеми остальными.
Что я уже знаю:
Есть много классов, связанных с этой темой; из их:
SynchronizationContext
(в _3 _) em>
Если бы я угадал, это был бы самый простой вопрос; хотя я не понимаю, что именно он делает и как его используют.AsyncOperation
& _ 5_ (вSystem.ComponentModel
)
Кажется, быть оберткой вокругSynchronizationContext
. Не знаю, как их использовать.WindowsFormsSynchronizationContext
(вSystem.Windows.Forms
)
ПодклассSynchronizationContext
.ISynchronizeInvoke
(в _12 _) em>
Используется Windows Forms. (КлассControl
реализует это. Если бы мне пришлось угадывать, я бы сказал, что эта реализация используетWindowsFormsSynchronizationContext
.)Dispatcher
&DispatcherSynchronizationContext
< em> (inSystem.Windows.Threading
)
Похоже, что последний является еще одним подклассомSynchronizationContext
, и первый делегирует ему.
Некоторые потоки имеют собственный цикл сообщений вместе с очередью сообщений.
(Страница MSDN О сообщениях и очередях сообщений содержит вводную справочную информацию о том, как циклы сообщений работают на системном уровне, т. е. очереди сообщений как Windows API.)
Я вижу, как можно реализовать вызов между потоками для потоков с очередью сообщений. Используя Windows API, вы можете поместить сообщение в очередь сообщений определенного потока через _ 19_, который содержит инструкцию для вызова некоторого делегата. Цикл сообщений, который выполняется в этом потоке, в конечном итоге дойдет до этого сообщения, и будет вызван делегат.
Из того, что я прочитал в MSDN, поток автоматически не имеет собственной очереди сообщений. Очередь сообщений станет доступной, например. когда поток создал окно. Без очереди сообщений для потока не имеет смысла иметь цикл сообщений.
Итак, возможен ли вообще вызов делегата между потоками, когда целевой поток не имеет цикла сообщений? Скажем, в консольном приложении .NET? (Судя по ответам на этот вопрос, я полагаю, что это действительно невозможно с консольными приложениями.)