【问题标题】:Constantly monitor if a process is running持续监控进程是否正在运行
【发布时间】:2015-08-13 15:32:00
【问题描述】:

我有以下代码:

Dim p() As Process

Private Sub CheckIfRunning()
    p = Process.GetProcessesByName("skype") 'Process name without the .exe
    If p.Count > 0 Then
        ' Process is running
        MessageBox.Show("Yes, Skype is running")
    Else
        ' Process is not running
        MessageBox.Show("No, Skype isn't running")
    End If
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    CheckIfRunning()
End Sub

而且效果很好!

但我想知道如何将其转换为监控应用程序,以不断检查进程是否正在运行。是否像每 1 秒检查一次计时器一样简单,还是有更好、更有效的方法来解决这个问题。

在最终结果中,我希望有一个基于进程的“正在运行”或“未运行”的标签,但我需要一些东西来不断地观察进程。

【问题讨论】:

  • 您可以通过多种方式实现这一目标。我会亲自生成一个工作线程,该线程一直运行到停止并监视服务。但是,您可以使用多种解决方案来解决此问题。
  • 您对下面@keith 的回答有何感想?你认为有理由把这个检查放在它自己的线程中吗?还是任务如此微不足道以至于不值得付出努力?

标签: vb.net timer process monitor


【解决方案1】:

如果您需要始终运行应用程序,那么您根本不需要计时器。订阅Process.Exited() 事件以在它关闭时收到通知。例如,使用记事本:

Public Class Form1

    Private P As Process
    Private FileName As String = "C:\Windows\Notepad.exe"

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim ps() As Process = Process.GetProcessesByName(Path.GetFileNameWithoutExtension(FileName))
        If ps.Length = 0 Then
            P = Process.Start(FileName)
            P.EnableRaisingEvents = True
            AddHandler P.Exited, AddressOf P_Exited
        Else
            P = ps(0)
            P.EnableRaisingEvents = True
            AddHandler P.Exited, AddressOf P_Exited
        End If
    End Sub

    Private Sub P_Exited(sender As Object, e As EventArgs)
        Console.WriteLine("App Exited @ " & DateTime.Now)
        Console.WriteLine("Restarting app: " & FileName)
        P = Process.Start(FileName)
        P.EnableRaisingEvents = True
        AddHandler P.Exited, AddressOf P_Exited
    End Sub

End Class

假设您想打开它(如果它尚未运行),它将一直保持打开状态。

如果您不想自己打开它,并且需要检测它何时打开,那么您可以通过 ManagementEventWatcher 使用 WMI,就像在这个 previous SO question 中一样。

【讨论】:

    【解决方案2】:

    我已经做了类似的事情来监控一个我需要一直运行的 exe,并在它关闭时重新启动它。 我的作为 Windows 服务运行 - 这样它会在 Windows 启动时启动,并且 id 永远不需要照顾它。

    或者,您可以将其创建为控制台应用程序并将其放入您的启动文件夹中?

    我有:

    Sub Main()
    
        Do
            Check_server()
            Dim t As New TimeSpan(0, 15, 0)
            Threading.Thread.Sleep(t)
        Loop
    
    End Sub
    
    
    Public Sub Check_server()
    
        Dim current_pros() As Process = get_pros()
        Dim found As Boolean = False
    
        If Now.Hour < "22" Then
            For Each pro In current_pros
                If pro.ProcessName.ToLower = "Lorraine" Then
                    found = True
                    Exit For
                Else
                    found = False
                End If
            Next
            If found Then
                Console.WriteLine("Server up")
            Else
                Console.WriteLine("Server down - restarting")
                restart_server()
            End If
        End If
    End Sub
    

    我的“服务器”应用程序被称为 Lorraine...还有一个计时器可能比让线程休眠更好的做法..

    【讨论】:

    • 如何让windows服务运行GUI程序?
    • 一个与用户交互的 GUI 程序?
    • 是的,我需要确保我的交互式 GUI 程序始终启动
    • 好的。那可能很难。可能是一个单独的问题。问题将围绕运行服务的帐户 - 如果它是 SYSTEM,它启动的任何进程都将在 SYSTEM 上下文中运行,并且对系统的标准用户不可用
    【解决方案3】:

    根据我的经验,一个简单的计时器效果最好:

    'Timer interval set to 1-5 seconds... no remotely significant CPU hit
    Private Sub timerTest_Tick(sender As System.Object, e As System.EventArgs) Handles timerTest.Tick
        Dim p() As Process = Process.GetProcessesByName("Skype")
        lblStatus.Text = If(p.Length > 0, "Skype is running.", "Skype isn't running.")
    End Sub
    

    您的里程可能会有所不同,但除非必要,否则我不喜欢处理单独的线程。

    【讨论】:

      猜你喜欢
      • 2020-05-03
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      • 2016-11-27
      相关资源
      最近更新 更多