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

Posted

技术标签:

【中文标题】WinForms中的进程间多线程通信(网络浏览器控件)【英文标题】:Inter process multi threaded communication in WinForms (web browser control) 【发布时间】:2011-10-04 14:28:16 【问题描述】:

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

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

我的情况是这样的:

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

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

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

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

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

您可以在此处找到我的代码示例(VS 2010): http://www.filedropper.com/interprocesscomunicationusingwithwebbrowser

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

【问题讨论】:

阻塞 UI 线程是非法的。例如,在回调中使用 PipeStream.BeginRead() 和 Control.BeginInvoke()。 据说要同步保存js代码 【参考方案1】:

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

【讨论】:

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

Python网络编程(进程通信信号线程锁多线程)

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

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

Linux的进程/线程间通信

Linux的进程/线程间通信

如何与 Ruby 中的线程通信?