【发布时间】:2012-04-20 12:53:36
【问题描述】:
我目前正在处理一个 c# 项目,并且正在使用 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));
}
【问题讨论】:
-
听起来您应该使用字典,并使用 StatusEnum 之类的内容将每个进程保存到字典中。
-
我想我是为了触发输出事件,我会添加一些代码,这样可能会有所帮助
标签: c# multithreading system.diagnostics