我目前正在处理 ac# 项目,并且正在使用 System.Diagnostic.Process 类。
当我的程序启动时,它会创建一个新线程,并在每个线程中启动一个不同的进程。
在某些时候,我需要检查程序中的设置,以查看每个进程是否应该继续运行或是否应该停止,但我不知道如何引用由某个线程启动的进程。每个线程我在进程启动时都给了一个名字,但我的理解是 c# 创建线程,启动进程然后关闭线程,即使进程仍在运行并且仍在接收输出。
有没有办法可以找出哪个进程由哪个线程启动并取消该进程的运行。
但是我看不到如何使用此方法和字典来停止基于此线程名称的进程。
更新 下面的请求是我正在使用的代码,它在线程中创建每个进程。我在字典中使用该线程,以便可以从 outputreceived 事件中引用它,但如果我需要关闭该进程,我不确定该怎么做。
Thread worker = new Thread(new ThreadStart(() => startProducts(product.Value[0].startScript, product.Value[0].productName)));
worker.IsBackground = false;
worker.Name = product.Value[0].productName;
worker.Start();
logging.logger(string.Format("Starting product '{0}'", product.Value[0].productName));
线程调用的方法如下,这是每个进程启动的地方。每个进程都保证有一个不同的命名线程,永远不会有两个同名的线程。
private void startProducts(string startScript, string product)
{
Process startProductProcess = new Process();
startProductProcess.StartInfo.FileName = startScript;
if ( configManagement.productConfig[product][0].requireArguments == true )
{
startProductProcess.StartInfo.Arguments = configManagement.productConfig[product][0].arguments;
}
startProductProcess.StartInfo.UseShellExecute = false;
startProductProcess.StartInfo.RedirectStandardOutput = true;
StringBuilder processOutput = new StringBuilder("");
startProductProcess.OutputDataReceived += new DataReceivedEventHandler(startProductProcess_OutputDataReceived);
startProductProcess.Exited += new EventHandler(startProductProcess_Exited);
processTag.Add(startProductProcess, product);
startProductProcess.Start();
//Process localByName = Process.GetProcessById(startProductProcess.Id);
startProductProcess.BeginOutputReadLine();
logging.logger(string.Format("Started {0} with: {1} {2}", product,
startProductProcess.StartInfo.FileName, startProductProcess.StartInfo.Arguments));
}