我在C#中使用.NET 4。我有LauncherProgram.exe,它将创建WorkerProgram.exe的多个实例,让他们对创建进程时提供的参数做一些工作,然后LauncherProgram.exe将启动一组新的WorkerProgram.exe实例来做一些不同的工作
每个WorkerProgram.exe都会启动一些参数,告诉它可以处理什么,并且可以同时启动一个或多个WorkerProgram.exe。 WorkerProgram.exe读取提供的参数,执行一些初始化,然后准备好完成工作。
我想弄清楚的是如何使每一组WorkerProgram.exe同时启动“告诉”或“信号”或“我无法弄清楚正确的术语”LauncherProgram.exe每个进程都已完成初始化步骤并准备开始。我想在一组中启动的WorkerProgram.exe实例中同步“执行您的工作”的开始。
我正在设置我的LauncherProgram.exe以便像这样工作(暂时忽略类型):
while (there are sets of work to do)
{
for each set of work
{
for each group data in set
create and launch a WorkerProgram.exe for a single set of data
wait for all created WorkerProgram.exe to indicate init is complete
send signal to start processing
}
}
我实际上有一个小测试程序,我使用命名事件来指示多个生成的进程同时启动某些内容。
(希望以上所有内容都有意义)
我只是无法弄清楚“等待N个进程告诉我他们的初始化已准备就绪”位。
我搜索了“进程同步”和“集合点”,并查看了使用命名事件和命名信号量。我可以找到一些关于线程的东西,但不是关于单独的进程。
LauncherProgram.exe使用System.Diagnostics.Process类创建WorkerProgram.exe进程,如果有帮助的话。
如果你能给我更好的条款来帮助我缩小搜索范围,或者指出一个设计模式或机制,或者一个有帮助的图书馆或课程,我会非常感激。
感谢。
答案 0 :(得分:1)
您可以使用System.Threading.Mutex
类进行进程间通信。见http://msdn.microsoft.com/en-us/library/system.threading.mutex(v=vs.110).aspx。命名每个Mutex可能最容易,给出WorkerProgram.exe的进程ID或其他一些区别特征作为名称。
答案 1 :(得分:0)
你可以使用一些进程间通信,但简单的方法是写入临时文件,例如将DONE写入某个文件并让Launcher定期读取,直到所有WorkerProgram将DONE写入各自的文件等等...甚至在Windows中创建FileMapping
以在具有文件备份的进程之间共享内存。
其他方法包括远程过程调用,套接字和简单文件映射。