我目前正在研究c#項目並使用System.Diagnostic.Process類。關閉通過線程啓動的進程
當我的程序啓動時,它創建一個新的線程,並在每個線程內啓動一個不同的進程。
在某些時候,我需要檢查一下我的程序中的設置,看看每個進程是否應該繼續運行,或者是否應該停止運行,但我不知道如何引用某個線程啓動的進程。每個線程我在進程啓動時給出了一個名字,但我的理解是c#創建線程,啓動進程,然後關閉線程,即使進程仍在運行並仍在接收輸出。
有沒有一種方法,我可以找出哪個進程是由哪個線程開始的,並從運行中取消該進程。
但我看不出如何使用此方法和字典能夠停止基於此線程名稱的過程。
UPDATE 由於下面的請求是我使用的代碼,它創建線程中的每個進程。我正在使用字典中的線程,以便可以從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的字典。 – SimpleVar 2012-04-20 12:55:42
我想我是爲輸出事件解僱我會添加一些代碼,所以它可能會幫助 – Boardy 2012-04-20 12:58:12