2

如何使 process-1 能够在 process-2 中触发事件,并发送一些参数,以指示第二个进程执行特定操作,并可选择接收回复?

可以使用文件系统来执行此操作,可能有一个文件,其中 process-1 转储了一些命令/查询,而 process-2 将不断地从该文件中读取,但是,这个解决方案并不好。

还有其他方法吗?

(我知道在 VB.net 中很容易在启动新进程时触发正在运行的进程中的事件,如果在项目属性中启用了“单个实例”)

4

3 回答 3

2

您可以使用命名的EventWaitHandle来实现跨进程同步。

于 2013-03-16T17:37:26.837 回答
1

这篇文章似乎做了你习惯的事情vb.net single instance(而且它似乎仍然是一个可行的选择)。

简而言之,似乎有三种方法可以完成类似单实例的解决方案:

  • 使用互斥体
  • 循环浏览进程列表,查看是否有同名进程正在运行
  • 将 Visual Basic 系统用于单实例应用程序(可以从 C# 访问)
于 2013-03-16T17:40:08.037 回答
1

如果“进程”是指“应用程序域”,那么在两者之间设置事件是相当容易的。事实上,如果你在两个独立的应用程序域中有两个类(每个类都有 MarshalByRefObject 作为基类),那么 .net 将自动设置一个远程处理结构,使事件看起来像在单个应用程序中一样 -领域。(这里的例子:http: //msdn.microsoft.com/en-us/library/system.marshalbyrefobject.aspx

不过这里的关键是“出现”。“应用程序域”和“进程”分离旨在有意保持资源隔离。要访问您的进程之外的任何内容,您确实需要操作系统的帮助,例如共享文件或 Internet 连接或命名管道 - 类似的东西。但是像事件这样的 .net 概念在运行时中不存在于您的空间之外。

换句话说,如果两个进程都在同一台机器上,您必须使用类似 Named-Pipes ( http://msdn.microsoft.com/en-us/library/system.io.pipes.namedpipeserverstream.aspx ) 的东西, TCPClient/TCPListener ( http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.aspx ) 如果跨多个系统进行通信,或者 WCF 如果您需要更重的任务。

如果您想在实践中看到其中一种技术的具体示例,我可以为您写一个,顺便说一句。

于 2013-03-16T17:45:55.233 回答