WinForms中的进程间多线程通信(Web浏览器控件)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WinForms中的进程间多线程通信(Web浏览器控件)相关的知识,希望对你有一定的参考价值。

我有2个进程,我想在它们之间启用多线程通信。

这两个进程都是STA,因为它们包含Web浏览器控件(活动x)。

我的情况是这样的:

  1. 过程1:向过程2发送消息并等待返回
  2. 过程2:向进程1发送消息(不作为返回值,不同的消息)
  3. 过程1:返回过程2消息的结果
  4. 过程2:返回过程1消息的结果

当我尝试执行第2步时,进程2挂起,因为进程1主线程等待结果。

我正在使用命名管道进行通信,但我对任何其他通信方法(“真实”通信,而不是共享内存)持开放态度。我正在寻找的是当主线程(或任何其他线程)等待响应时,在进程1中将打开一个新线程。

我必须使用主线程来执行调用,因为它最初是从Web浏览器控件启动的(使用“脚本对象”)。

如果有一种方法可以将主线程的调用堆栈“移动”到另一个线程(然后将其返回到主线程以与Web浏览器通信),那么这将是一种可能的解决方案。

你可以在这里找到我的代码示例(VS 2010):http://www.filedropper.com/interprocesscomunicationusingwithwebbrowser

调试这种情况可能很棘手。你需要在运行InterProcessComunicationUsingWithWebBrowser2之前运行InterProcessComunicationUsingWithWebBrowser,然后在return Sender.SendMessage(ProcessNamedPipes.Process2, "hello") + Guid.NewGuid().ToString("n");的第40行(Form1.cs)中设置一个断点

答案

我找到了解决方案!我将应用程序更改为MTA并在新的STA线程中创建了浏览器表单

以上是关于WinForms中的进程间多线程通信(Web浏览器控件)的主要内容,如果未能解决你的问题,请参考以下文章

JS(单线程)与浏览器(多进程)

WinForms 中的每个表单都有自己的线程吗?

[培训-无线通信基础-10]:正交频分复用(OFDM符号间多径干扰)

进程通信和线程通信

Java进程间通信和线程间通信?

GUN C中的socket学习