我编写了一个启动第三方程序的应用程序,该程序从我的程序中的电视频道下载媒体流。我使用的程序是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” 。这样的东西,以确定哪些已经开始并且正在运行。可能吗?我找不到设置友好名称的方法。
答案 0 :(得分:2)
您无法更改进程名称,但您可以:
答案 1 :(得分:2)
扩展阿列克谢所说的 - 你可以创建一个字典< int,string>跟踪您创建的进程ID /描述性名称。也许您应该将其写入文件以防程序崩溃 - 但是您需要一些特殊的启动处理来处理退出的进程。
在启动时,您需要读取文件,并检查当前进程以查看它们是否与您拥有的进程匹配,并删除任何不再存在的进程(错误的进程ID或exe名称)。每次创建新进程并写入文件时,您可能希望这样做。
答案 2 :(得分:1)
以下是您可以使用的一些代码。
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);
}
}
}
}
答案 3 :(得分:1)
将进程信息写入文件(或内存映射文件)可能是最佳选择;
但是,您也可以查看Windows消息。即向每个进程发送消息;并让他们回复他们的“内部名称”。
基本上你有一切都在那个队列上听;您首先发送一个命令,命令其他进程报告其内部名称,然后将它们与自己的进程ID一起转储到消息队列中;
请参阅MSMQ
答案 4 :(得分:1)
我对自己也有同样的问题,因为我的解决方案创建了一个新类 - MyProcess 继承 流程,添加了属性 - 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; }
}