#winforms #ipc
#winforms #ipc
Вопрос:
У меня есть 2 процесса, которые я хочу включить многопоточную связь между ними.
Оба процесса являются STA, поскольку они содержат элемент управления веб-браузером (активный x).
Мой сценарий таков:
- Процесс 1: отправьте сообщение процессу 2 и дождитесь возврата
- Процесс 2: отправьте сообщение процессу 1 (не как возвращаемое значение, другое сообщение)
- Процесс 1: возвращает результат для сообщения процесса 2
- Процесс 2: возвращает результат для сообщения процесса 1
Когда я пытаюсь выполнить шаг 2, процесс 2 зависает, потому что основной поток процесса 1 ожидает результата.
Я использую именованные каналы для связи, но я открыт для любого другого метода связи («реального» общения, а не разделяемой памяти). Я ищу то, что новый поток будет открыт в процессе 1, когда основной поток (или любой другой поток) ожидает ответа.
Я должен использовать основной поток для выполнения вызова, потому что он изначально инициировался из элемента управления веб-браузером (с использованием «object for scripting»).
Если есть способ «переместить» стек вызовов основного потока в другой поток (а затем вернуть его в основной поток для связи с веб-браузером), это будет возможным решением.
Вы можете найти мой пример кода здесь (VS 2010): http://www.filedropper.com/interprocesscomunicationusingwithwebbrowser
Отладка этой ситуации может быть сложной. Перед запуском необходимо InterProcessComunicationUsingWithWebBrowser2
выполнить InterProcessComunicationUsingWithWebBrowser
, затем поставить точку останова в строке 40 ( return Sender.SendMessage(ProcessNamedPipes.Process2, "hello") Guid.NewGuid().ToString("n");
) в Form1.cs
Комментарии:
1. Блокировка потока пользовательского интерфейса является незаконной. Используйте, скажем, PipeStream . BeginRead() и управление. BeginInvoke() в обратном вызове.
2. как уже говорилось, для хранения кода js он должен быть синхронизирован
Ответ №1:
Я нашел решение! я изменил приложение на MTA и создал форму браузера в новом потоке STA