Многопоточная связь между процессами в WinForms (управление веб-браузером)

#winforms #ipc

#winforms #ipc

Вопрос:

У меня есть 2 процесса, которые я хочу включить многопоточную связь между ними.

Оба процесса являются STA, поскольку они содержат элемент управления веб-браузером (активный x).

Мой сценарий таков:

  1. Процесс 1: отправьте сообщение процессу 2 и дождитесь возврата
  2. Процесс 2: отправьте сообщение процессу 1 (не как возвращаемое значение, другое сообщение)
  3. Процесс 1: возвращает результат для сообщения процесса 2
  4. Процесс 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