0

現在、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));
        }
4

2 に答える 2

0

なぜスレッド名を何かに使用するのですか?このアクティビティをプールすると、特定のプロセスを実行するスレッドがわからなくなります。

プロセスを管理している場合は、プロセス名、プロセスEXEパス、プロセスハンドル、プロセスの終了を待機しているスレッド、ステータス列挙型、保持するミューテックスのフィールドとプロパティを含むことができる「managedProcess」クラスを定義します。フィールドはスレッドセーフで、開始および停止するメソッド-プロセスに関係するもの。このmanagedProcessクラスのインスタンスをコンテナに押し込みます。

私見ですが、デバッグ以外のスレッド名は忘れてください。

終了-stop()メソッドで、WM_CLOSEを投稿してみて(直接実行できますか、それともP / Invokeですか?)、スレッド待機がプロセスが閉じたことを通知するかどうかを確認するために数秒間待機します。そうでない場合は、TerminateProcess()(またはTerminateProcessの管理対象のもの)を呼び出します。

于 2012-04-20T13:56:36.400 に答える
0

個別のスレッドを使用して各プロセスを作成することで解決される特定のニーズがない限り、スレッドは使用しないでください。コード内の特定のプロセスを識別する一意の方法だけを探している場合はスレッドに付けた名前を辞書の識別子として使用できます。

Dictionary<string, Process> processesByName = new Dictionary<string, Process>();
Process firstProcess = ... //Start your process
Process secondProcess = ... //Start your process
processesByName.Add("FirstProcessName", firstProcess);
processesByName.Add("SecondProcessName", secondProcess);

その後、割り当てた名前で特定のプロセスをプルし、必要に応じて操作できます。

Process process = processesByName["FirstProcessName"];
if (!process.HasExited)
{
    process.CloseMainWindow();
    process.Close();
}
于 2012-04-20T16:34:16.677 に答える