我正在编写一个简单的监视程序应用程序,它将根据第三个应用程序是否正在运行来启动和停止我正在编写的另一个应用程序。 换句话说,如果应用程序A正在运行,则启动应用程序B.当应用程序A停止时,停止应用程序B.
问题是我的看门狗一直停止应用程序B并立即重新启动它。
这就是我所拥有的:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Diagnostics;
using System.Windows.Forms;
using WindowScrape.Types;
namespace ConnectAndWait
{
class CheckForApplication
{
public static System.Windows.Forms.Timer _timer = new System.Windows.Forms.Timer();
public static bool goodtogo;
public static void checking()
{
_timer.Interval = 3000;
_timer.Tick += _timer_Tick;
_timer.Start();
}
public static void _timer_Tick(object sender, EventArgs e)
{
Process[] myprocess = Process.GetProcessesByName("ApplicationA");
Process[] proc = Process.GetProcessesByName("notepad");
if (myprocess.Length == 0)
{
goodtogo = false;
}
else
{
var win = Process.GetProcessesByName("ApplicationA");
var mainform = NativeMethods.FindWindow("TMainForm_ihm", null);
var children = NativeMethods.FindWindowEx(mainform, IntPtr.Zero, "TRzPageControl", null);
var final = NativeMethods.FindWindowEx(children, IntPtr.Zero, "TRzTabSheet", "Operation" );
if (final.ToString() != "0")
{
goodtogo = true;
}
else
{
goodtogo = false;
}
}
if (goodtogo == true)
{
if (proc.Length == 0)
{
Process.Start("notepad.exe");
MessageBox.Show("notepad started");
}
}
else if (goodtogo == false)
{
if (proc.Length != 0)
{
proc[0].Kill();
MessageBox.Show("process killed"); // <-- This never gets fired
// as long as application A keeps running. At first I thought I was stopping it
// with this code so I put the messageBox in to test that theory.
}
}
}
}
}
我现在开始并停止记事本只是为了测试。
谁能看到我做错了什么?
首先:即使其他应用程序仍在运行,导致记事本停止然后重新启动的原因是什么?
第二:如果还有什么我应该采取不同的做法,请同样指出。
与往常一样,非常感谢您提供的任何帮助。
编辑: 之前我没有提到它,因为我缺乏知识,我认为它不相关。
项目的整个范围是我正在编写两个现有应用程序之间的集成。如果一个应用程序没有运行,那么我的应用程序就不需要使用资源。所以我的想法是看门狗占用的资源少于应用程序本身。
我的集成应用程序使用多个线程,并在其他两个应用程序之间获取和设置大量信息。
最终用户将在需要时启动和停止应用程序A.
应用程序B是我的集成应用程序。
应用程序C - 以前未提及的应用程序 - 作为服务运行并与数据库交互。
有问题的看门狗应用程序只是在应用程序A停止或启动时启动和停止我的集成应用程序。
答案 0 :(得分:2)
根本不需要这样一个监督者&#39;。使用Job objects并绑定作业中的进程。阅读Destroying all child processes (and grandchildren) when the parent exits。有关C#示例,请参阅Working example of CreateJobObject/SetInformationJobObject pinvoke in .net?。
对于流程启动,请使用WMI Win32_ProcessStartTrace,请参阅.NET Process Monitor。