这是继续:
Find Window By Caption what is the caption of the window?
为了缩短它我有一个记录器留在托盘中。
然后我有一个启动程序B的程序A.我通过图标跟踪情况:
所以正常的循环颜色是: 红色 - 蓝色 - 绿色 - 红色
如果我在没有记录器的情况下启动A ---> B,则不会出现任何不良情况
记录器保持驻留状态,并使用计时器在发现进程B时通过事件与进程建立连接来扫描进程。
private void TimerCheck(object sender, EventArgs e)
{
Process[] procList = Process.GetProcessesByName("PCDLRN");
if(procList.GetLength(0) != 0)
{
Stream iconStream = Application.GetResourceStream(new Uri("pack://application:,,,/Resources/Images/Blueball.ico")).Stream;
notifyIcon.Icon = new System.Drawing.Icon(iconStream);
notifyIcon.Visible = true;
Thread.Sleep(1000);
pcdApplication = new PCDLRN.Application();
pcdApplication.WaitUntilReady(500);
pcdEvents = pcdApplication.ApplicationEvents;
pcdEvents.OnStartExecution += PcdEvents_OnStartExecution;
pcdEvents.OnEndExecution += PcdEvents_OnEndExecution;
timerCheckPCDmis.Stop();
}
}
当程序B开始执行时,图标变为绿色
private void PcdEvents_OnStartExecution(PCDLRN.PartProgram PartProg)
{
Stream iconStream = Application.GetResourceStream(new Uri("pack://application:,,,/Resources/Images/GreenBall.ico")).Stream;
notifyIcon.Icon = new System.Drawing.Icon(iconStream);
notifyIcon.Visible = true;
}
相反,当它完成后再次变红
private void PcdEvents_OnEndExecution(PCDLRN.PartProgram PartProg, int TerminationType)
{
Stream iconStream = Application.GetResourceStream(new Uri("pack://application:,,,/Resources/Images/RedBall.ico")).Stream;
notifyIcon.Icon = new System.Drawing.Icon(iconStream);
notifyIcon.Visible = true;
pcdEvents.OnStartExecution -= PcdEvents_OnStartExecution;
pcdEvents.OnEndExecution -= PcdEvents_OnEndExecution;
timerCheckPCDmis.Start();
}
但它会变红而后变蓝。因此,这个过程仍然存在,并且通过我的检查保持活着。这是一个僵尸进程吗?
请注意,如果我执行ctrl + alt + canc并查找进程,则找不到B程序的名称。所以Windows不跟踪僵尸? 那说我随时可以用
杀死它Process[] procList = Process.GetProcessesByName("PCDLRN");
if (procList.GetLength(0) != 0)
procList[0].Kill();
但这可能会产生其他问题,所以更好地理解为什么它还活着。
唯一认为我认为保持活着的唯一方法是事件连接,但我确实
pcdEvents.OnStartExecution -= PcdEvents_OnStartExecution;
pcdEvents.OnEndExecution -= PcdEvents_OnEndExecution;
那还有什么让它保持活力?
---编辑emoacht ---
我会试着让它变得更加简单。 我有一个记录器留在托盘中。
比用户可以启动程序。这不是我公司制作的一个程序。我只有一个公开一些成员和事件的库。 我感兴趣的是StartExecution和EndExecution。
所以我的程序保持沉默,并在外部程序进程出现时通过计时器检查。
发生这种情况时,我通过onStartExecution和onEndExecution事件建立连接。
当onEndExecution我与pcdEvents.OnStartExecution - = PcdEvents_OnStartExecution分离事件时;和pcdEvents.OnEndExecution - = PcdEvents_OnEndExecution;
然后计时器重新开始等待外部程序进程。
诀窍是,从那时起,计时器IMMEDIATELY告诉外部进程是活着的。但如果我去TASK MANAGER,我就不会看到它。相反,我可以通过循环进程并杀死它来杀死它。
由于我被低估了,我想我必须更加精确地回答我的问题。所以:
这是"等待进程 - 连接 - 等待结束 - 分离"策略正确
在枚举进程时,任务管理器中看不到但是存在的进程是僵尸
最后如何避免僵尸......
--- --- ADD 我还有其他信息。当我停止并重新启动记录器程序时,前面提到的僵尸会死!所以它真的是我的记录器让僵尸活着