最佳实践:App1.exe启动进程App2.exe,然后App2.exe需要关闭App1.exe

时间:2011-02-10 16:14:07

标签: c# process

下午好。

我需要承认这是一项奇怪的工作,但我需要它......: - )

今天有一个C#控制台应用程序(我将其命名为App1.exe)由我的同事调用,在COBOL中工作。当App1.exe完成其工作,关闭自身,然后COBOL程序可以继续读取从App1生成的文件。

这个App1每天开启和关闭一百次,而且不是那么快...... 现在我需要在系统托盘应用程序中获取业务逻辑,随时准备好,快速回复请求,但我不能强迫我的同事更改他们的程序:他们将调用App1.exe,等待它关闭。所以我创建了一个单一的App2.exe(我不能使用系统服务)做的工作;所以现在我想到了这个解决方案:App1.exe只调用App2.exe(传递命令行参数),然后它保持待机状态(使用Process.Start(App2.exe)和Process.WaitForExit())。当App2.exe完成工作时,杀死App1.exe,因此COBOL程序可以检测到工作已完成并继续读取从App2.exe生成的文件。

在这个解决方案中(快速而肮脏的方式,我只是在尝试......)有一个问题:App2.exe被App1.exe调用,所以看来一个被调用的exe无法杀死他的父,不是它?

有更好的/推荐的方式来做这种工作吗? 我只能使用C#2.0。

谢谢你们,欢迎任何想法 南多

4 个答案:

答案 0 :(得分:2)

使用其中一个进程间通信机制让app1.exe与app2.exe对话。套接字,命名管道,远程处理,WCF。由于您只需要传递命令行,因此简单的套接字可以完成工作。当你从app2.exe收到一条消息说该作业已经完成时退出app1.exe,不需要杀死任何东西。

答案 1 :(得分:0)

创建一个监督整个过程的经理/监控应用程序。它按需创建一个新的子应用程序(App1)。然后,App1可以通过询问经理/监视器来请求启动App2。

如果App2然后想要关闭App1,它可以要求经理/监视器执行此操作。

通过这种方式,您可以调试,记录,监控,审核和制定每个应用程序启动/停止时的规则。好多了!

答案 2 :(得分:0)

这是我用来调用和终止进程的代码。

//App1.exe
var p = Process.Start("App2.exe", myargs);
p.WaitForExit();

//App2.exe
//do the work calling my App2.exe business logic plugin...
//Close calling exe; caller variable is fullpath of my App1.exe, like D:\myapp\app1.exe
Process[] pArry = Process.GetProcesses();
foreach (Process p in pArry)
{
    string s = p.ProcessName;
    s = s.ToLower();
    if (s.CompareTo(caller) == 0)
    {
        p.Kill();
    }
}

非常简单的代码,可能太简单了:-)
谢谢!

答案 3 :(得分:0)

我发现了一个有趣的项目:WCF Killer 这是一个简单而强大的客户端 - 服务器TCP堆栈实现;可能是我需要的一个很好的解决方案 再见,Nando