現在、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));
スレッドが呼び出すメソッドは次のとおりです。ここで各プロセスが開始されます。各プロセスは異なる名前のスレッドを持つことが保証されており、同じ名前のスレッドが 2 つ存在することはありません。
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));
}