1

私は現在、System.Diagnostic.Process メソッドを使用して構成ファイル内のいくつかのスクリプトを起動する ac# プロジェクトに取り組んでいます。

新しいスレッドを作成し、プロセス情報を設定してプロセスを開始し、そのスクリプトからの出力を c# プログラムにリダイレクトすることによって開始する必要がある各スクリプトをループする foreach ループがあります。次に、Process.OutputDataReceived イベントを使用して、プログラムが出力を受信したときにトリガーします。

OutputDataReceived イベント ハンドラーで、イベントをトリガーしたスレッドの名前を特定する方法はありますか。

以下のコードは、スレッドを作成し、スレッドを開始します。

    public void prepareProductStart()
    {
        foreach ( ConfigManagement.ProductSettings product in configManagement.productSettings )
        {
            worker = new Thread(() => startProducts(product.startScript));
            worker.IsBackground = false;
            worker.Name = product.productName;
            worker.Start();
        }

スレッドが開始されると、出力イベントをトリガーするこのメソッドを呼び出します

    private void startProducts(string startScript)
    {
        //Thread productThread = new Thread();
        Process startProductProcess = new Process();
        startProductProcess.StartInfo.FileName = startScript;

        startProductProcess.StartInfo.UseShellExecute = false;
        startProductProcess.StartInfo.RedirectStandardOutput = true;
        StringBuilder processOutput = new StringBuilder("");
        startProductProcess.OutputDataReceived += new DataReceivedEventHandler(startProductProcess_OutputDataReceived);
        startProductProcess.Start();
        startProductProcess.BeginOutputReadLine();
    }

出力イベントは次のようになります。このイベントは、スレッドの名前を決定して、出力をどう処理するかを知る必要があります。

    private void startProductProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        //Find thread name and perform event based on thread name
    }

ご協力いただきありがとうございます。

4

1 に答える 1

2

IOコールバックは、CLR ThreadPoolに属し、自分のスレッドではないスレッドで呼び出されるため、名前はありません。したがって、実際には、スレッド名をプロセスに関連付けたいと考えています。

エレガントとはほど遠いですが、まあ、それはうまくいくと思います:

Dictionnary<Process, string> _processTags;クラスの属性にを追加します

次に、次のように変更startProductsします。

private void startProducts(string startScript)
{
    //Thread productThread = new Thread();
    Process startProductProcess = new Process();

    // Save tag
    _processTags.Add(startProductProcess, Thread.CurrentThread.Name);

    startProductProcess.StartInfo.FileName = startScript;
    startProductProcess.StartInfo.UseShellExecute = false;
    startProductProcess.StartInfo.RedirectStandardOutput = true;
    StringBuilder processOutput = new StringBuilder("");
    startProductProcess.OutputDataReceived += new DataReceivedEventHandler(startProductProcess_OutputDataReceived);
    startProductProcess.Start();
    startProductProcess.BeginOutputReadLine();
}

そしてstartProductProcess_OutputDataReceived

private void startProductProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    string threadName = _processTags[sender as Process];
    // stuff...
}
于 2012-04-20T10:22:05.577 に答える