6

我编写了一个应用程序来启动一个 3rd 方程序,该程序从我的程序上的电视频道下载媒体流。我正在使用的程序是 rtmpdump.exe。它们作为独立进程运行,如下所示:

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = path + rtmpdump;
startInfo.Arguments = rtmpdump_argument;
startInfo.WorkingDirectory = path;
startInfo.WindowStyle = ProcessWindowStyle.Minimized;
Process p = Process.Start(startInfo);

但是我想命名这些进程,所以如果我的程序崩溃或必须重新启动,那么我可以检查当前进程的名称,例如是否有一个名为“BBC World - News at 7”的进程。类似的东西可以识别哪些已经启动并且当前正在运行。可能吗?我找不到设置友好名称的方法。

4

5 回答 5

3

扩展 Alexei 所说的内容 - 您可以创建一个 Dictionary< int, string > 来跟踪您创建的进程 ID/描述性名称。也许你应该把它写到一个文件中,以防你的程序崩溃——但你需要一些特殊的启动处理来处理进程退出。

在启动时,您需要读取文件,并检查当前进程以查看它们是否与您拥有的匹配,并删除任何不再存在的进程(错误的进程 ID 或 exe 名称)。每次创建新进程并写入文件时,您可能都希望这样做。

于 2013-09-13T17:33:54.577 回答
2

您不能更改进程名称,但您可以:

于 2013-09-13T17:24:27.887 回答
2

这是您可以使用的一些代码。

public class ProcessTracker {
    public Dictionary<int, string> Processes { get; set; }

    public ProcessTracker() {
        Processes = new Dictionary<int, string>();
    }

    public void AddProcess(Process process, string name) {
        Processes.Add(process.Id, name);
    }

    //Check if what processes are still open after crash.
    public void UpdateProcesses() {
        List<Process> runningProcesses =
            Process.GetProcesses().ToList();

        Processes = Processes
            .Where(pair => runningProcesses
                .Any(process => process.Id == pair.Key))
            .ToDictionary(pair => pair.Key, pair => pair.Value);
    }

    //Use this to see if you have to restart a process.
    public bool HasProcess(string name) {
        return Processes.Any(pair => pair.Value != name);
    }

    //Write the file on crash.
    public void ReadFile(string path) {
        if (!(new FileInfo(path).Exists))
            return;

        using (StreamReader reader = new StreamReader(path)) {
            foreach (string line in  reader.ReadToEnd()
                .Split(new[] {"\n"}, StringSplitOptions.RemoveEmptyEntries)) {
                string[] keyPair = line.Split(',');

                Processes.Add(int.Parse(keyPair[0]), keyPair[1]);
            }
        }
    }

    //Read the file on startup.
    public void SaveFile(string path) {
        using (StreamWriter writer = new StreamWriter(path, false)) {
            foreach (KeyValuePair<int, string> process in Processes) {
                writer.WriteLine("{0},{1}",
                    process.Key, process.Value);
            }
        }
    }
}
于 2013-09-13T18:32:13.910 回答
1

将进程信息写入文件(或内存映射文件)可能是可行的方法;

但是,您也可以查看 Windows 消息传递。即向每个进程发送消息;并让他们回复他们的“内部名称”。

基本上,您可以在该队列中收听所有内容;您首先发送一个命令,命令其他进程报告其内部名称,然后他们将其连同自己的进程 ID 一起转储到消息队列中;

MSMQ

于 2013-09-13T18:50:46.347 回答
0

我对自己有同样的问题,因为我的解决方案创建了一个新类 - MyProcess,它继承Process添加了一个属性 - ProcessId

在我的情况下,我将 ProcessId 存储在与其他数据相关的数据库中。根据其他数据的状态,我决定终止该进程。

然后,我将进程存储在字典中,如果需要,可以将其传递给其他类,在这些类中可以访问以杀死进程。

因此,当我决定终止一个进程时,我会通过 ProcessId 从字典中提取该进程,然后将其终止。

下面的示例:

public class Program
{
    private static Dictionary<string, MyProcess> _processes;

    private static void Main()
    {
        // can store this to file or db
        var processId = Guid.NewGuid().ToString();

        var myProcess = new MyProcess
        {
            StartInfo = { FileName = @"C:\HelloWorld.exe" },
            ProcessId = processId
        };

        _processes = new Dictionary<string, MyProcess> {{processId, myProcess}};

        myProcess.Start();

        Thread.Sleep(5000);

        // read id from file or db or another
        var pr = _processes[processId];

        pr.Kill();

        Console.ReadKey();
    }
}

public class MyProcess : Process
{
    public string ProcessId { get; set; }
}
于 2017-11-02T18:41:33.140 回答