Поток, вызвавший CurrentDispatcher
, вероятно, по какой-то причине не качает сообщения.Наиболее вероятная причина в том, что у него нет механизма прокачки сообщений.Для правильной работы Invoke
целевой поток должен быть специально разработан для приема инъекций делегатов.Обычно это достигается тем, что целевой поток вращается в бесконечном цикле, ожидая появления сообщений в очереди.Затем другой поток отправит специальное сообщение, запрашивающее выполнение делегата.Все это настраивается автоматически в потоке пользовательского интерфейса Windows Forms или приложений WPF.Он не будет существовать в приложении службы Windows, пока вы не запустите его вручную.
Я бы не стал пытаться использовать этот метод маршалинга делегатов (или любой метод, который синхронно внедряет делегат в другой поток) в любом случае.Причина в том, что это приведет к тому, что асинхронный обратный вызов ввода-вывода, который выполняется в потоке ThreadPool
или в потоке порта завершения ввода-вывода, будет блокироваться до завершения этого делегированного маршалла.Вы не хотите связывать IO таким способом.
Вместо этого вы должны опубликовать данные, считываемые из потока, в общую структуру данных, такую как очередь или список, и затем выбрать исходный потокэто на определенном интервале.Если ожидается, что исходный поток будет ожидать чтения данных из потока, вы можете настроить шаблон производитель-потребитель.Это довольно легко с BlockingCollection
.Исходный поток будет вызывать Take
, который будет блокироваться до тех пор, пока не прибудет элемент, и обратный вызов IO опубликует данные, вызвав Add
.
Есть другие приемлемые способы, которые могут быть обработаны, но вызов Invoke
вероятно, не один из них.