실행중인 Windows 프로세스를 모니터링하는 코드를 작성했습니다. 특정 프로세스가 언제 시작되고 언제 종료되는지 알고 싶습니다. 코드는 원하는대로 작동합니다.프로세스를 지속적으로 모니터링합니다.
이제 Windows 용 서버 응용 프로그램에 구현하고 싶습니다. 양식이 살아있는 한 루프에서 실행됩니다. 나는 비동기 적으로 BackgroundWorker
을 사용하여 실행해야한다고 생각합니다. 나는 그것을하기위한 최선의 방법과 방법이 무엇인지 모릅니다.
using System;
using System.Management;
using System.Diagnostics;
using System.Collections.Generic;
using System.ComponentModel;
class ProcessMonitor
{
public static void Main()
{
Dictionary<string, Process> newProcs= new Dictionary<string, Process>();
while (true)
{
foreach (Process process in Process.GetProcesses())
{
if (process.ProcessName.CompareTo("Someprocess") == 0)
{
if (!searchForProcess(newProcs, process.Id))
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT CommandLine FROM Win32_Process WHERE ProcessId = " + process.Id);
foreach (ManagementObject @object in searcher.Get())
{
Console.Write("Adding new Process: ");
Console.WriteLine(@object["CommandLine"] + " ");
newProcs.Add(@object["CommandLine"] + " ", process);
}
}
}
}
checkProcesses(newProcs);
}
Console.WriteLine("Done");
}
private static bool searchForProcess(Dictionary<string, Process> newProcs, int newKey)
{
foreach (Process process in newProcs.Values)
{
if (process.Id == newKey)
return true;
}
return false;
}
private static void checkProcesses(Dictionary<string, Process> newProcs)
{
foreach (string currProc in newProcs.Keys)
{
bool processExists = false;
foreach (Process process in Process.GetProcesses())
{
if (process.Id == newProcs[currProc].Id)
{
processExists = true;
break;
}
}
if (!processExists)
{
Console.Write("Process Finished: ");
Console.WriteLine(currProc);
newProcs.Remove(currProc);
if (newProcs.Count == 0)
break;
}
}
}
}
어떤 아이디어 : 여기
내 모니터 코드?
는 "윈도우 폼 서버 응용 프로그램"으로 무엇을 의미합니까? –
타이머를 사용할 수 있습니다. 어떻게 작동해야하는지에 대한 사양이 있습니까? – Jocke
내 서버 쪽은 콘솔 응용 프로그램이 아닌 Windows 양식 응용 프로그램입니다. 기본적으로 클라이언트는 서버에 명령 요청을 보내고 서버는 명령 요청을 실행합니다. 그 명령을 추적하고 각 명령이 끝날 때 클라이언트에 알리고 싶습니다. – Idanis