C# 验证另一个应用程序是否始终在运行

C# 验证另一个应用程序是否始终在运行,c#,process,C#,Process,我正在尝试用c语言制作一个控制台应用程序,它将确认另一个应用程序始终在运行。另一个应用程序定期崩溃,我需要每隔几分钟检查一次,如果它停止工作,就重新启动它 有许多问题需要解决,以确保应用程序运行的实例不超过一个。我试图确认一个(不多或少)始终在运行 有人知道如何开始这样做吗?你有几个选择。第一个是使用process类检查正在运行的流程。我从微软网站上得到了这个,但它看起来很有效: public bool IsProcessRunning(string name) { //here we'

我正在尝试用c语言制作一个控制台应用程序,它将确认另一个应用程序始终在运行。另一个应用程序定期崩溃,我需要每隔几分钟检查一次,如果它停止工作,就重新启动它

有许多问题需要解决,以确保应用程序运行的实例不超过一个。我试图确认一个(不多或少)始终在运行


有人知道如何开始这样做吗?

你有几个选择。第一个是使用process类检查正在运行的流程。我从微软网站上得到了这个,但它看起来很有效:

public bool IsProcessRunning(string name)
{
    //here we're going to get a list of all running processes on
    //the computer
    foreach (Process clsProcess in Process.GetProcesses())
    {
        if (clsProcess.ProcessName.StartsWith(name))
        {
            //process found so it's running so return true
            return true;
        }
    }

    //process not found, return false
    return false;
}

您还可以使用进程间通信。这是我们在家里做的事情。我们有一个监视程序应用程序,它向被监视的服务发送消息。如果服务在超时期间未返回ACK,我们将尝试重新启动它。

我建议您检查应用程序是否在正在运行的进程列表中:

我建议使用查看您的流程是否正在运行,如果没有,则使用启动流程

var processes = Process.GetProcessesByName("yourProcessName");

if(processes.Length == 0)
{
    Process.Start(@"C:\Path\To\Your\Process.exe");
}

// Kill the extras
for(int i = 1; i < process.Length; i++)
{
    processes[i].Kill();
}
var processs=Process.GetProcessesByName(“yourProcessName”);
if(processs.Length==0)
{
Process.Start(@“C:\Path\To\Your\Process.exe”);
}
//杀了临时演员
for(int i=1;i
如果您实施了“不超过一个”规则(正如您所指出的,这一规则有很好的文档记录),然后实施了定期崩溃检查器,这应该足以确保运行一个且只有一个副本


事实上,周期性过程甚至不必检查崩溃。它只需启动一个实例,如果另一个实例已经在运行,它将立即退出,这要感谢您实现的“不超过一个”机制。这样做的另一个好处是避免在检测到死进程和启动新进程之间出现可能的争用情况。

这些命令对于控制进程非常有用:

// check for processes
Process[] processes = Process.GetProcessesByName("nameOfExecutable");
foreach (Process proc in processes)
{   
   // do stuff
}

// start process (need path)
Process.Start("pathToExecutable");

// close gui process gently (if needed)
bool status = proc.CloseMainWindow();

// wait for process to close gently
bool status = proc.WaitForExit(killTimeMS);

// force close (kill) process
proc.Kill();

可能与你的问题有关。至少,它有按进程名获取进程列表的代码。你能在你正在观看的应用程序上调用一些方法或东西吗?但为什么应用程序会崩溃呢?在你担心这些事情之前,你不需要解决这个问题吗?如果可以的话,从根本上解决问题。@Sergey这正是我需要的。非常感谢@Baszz——这是一个有效的观点,但即使是编写得最好的程序,如果长时间运行也会崩溃。通常使用shell(命令行)实用程序(如tasklist.exe或pslist.exe)生成进程监视程序脚本,而不是仅为任务生成可执行文件。或者对于更多.NET ish选项,PowerShell脚本可以使用
Get Process
…您的第二点非常有效。但我必须考虑这一点的影响。让一个新实例每五分钟启动一次,并在检测到另一个实例时立即停止,可能会产生不可预见的后果/开销。@CarlBenson:无论如何,不要忘记您每五分钟启动一个新进程。还要注意我关于比赛条件的补充意见。它们可能不太可能发生,但并发的一般规则是,如果它能够发生,它就会发生。防止多个进程运行的通常方法是,由一个且唯一的实例在命名资源的整个生命周期内锁定该资源,这使得竞争条件不可能存在。一个每隔几分钟运行一次的程序不能做到这一点。此外,没有什么可以阻止您实现进程列表检查和互斥锁。