2017-09-11 8 views
-2

私は答えから、次のコードをしました:私は、同時に複数のインスタンスを呼び出す必要があります私の場合はProcess.start: how to get the output?非同期C#のシェルへの呼び出しが新しいスレッドを開いていますか?

static void runCommand() { 
    //* Create your Process 
    Process process = new Process(); 
    process.StartInfo.FileName = "cmd.exe"; 
    process.StartInfo.Arguments = "/c DIR"; 
    process.StartInfo.UseShellExecute = false; 
    process.StartInfo.RedirectStandardOutput = true; 
    process.StartInfo.RedirectStandardError = true; 
    //* Set your output and error (asynchronous) handlers 
    process.OutputDataReceived += new DataReceivedEventHandler(OutputHandler); 
    process.ErrorDataReceived += new DataReceivedEventHandler(OutputHandler); 
    //* Start process and handlers 
    process.Start(); 
    process.BeginOutputReadLine(); 
    process.BeginErrorReadLine(); 
    process.WaitForExit(); 
} 
static void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine) { 
    //* Do your stuff with the output (write to console/log/StringBuilder) 
    Console.WriteLine(outLine.Data); 
} 

が、私はスレッドを作る際に考えていたが、私は必要がないことを理解しこのコードのスレッド。誰かが私にその違いを説明でき、必要な場合にスレッドが非同期呼び出しを行うようにすることができますか?
ありがとうございます。種類については、

+1

「このコードではスレッドが必要ないことを理解しています」ということを理解しているので、なぜこの質問をしていますか? – Servy

+0

私はその違いを理解していないので。ご協力いただきありがとうございます。 –

+0

あなたがその違いを理解していないなら、あなたはその違いを理解していると言った理由は何ですか? – Servy

答えて

0

あなたのプロセスを並行して実行する場合は、コードを少し変更する必要があります。行 "process.WaitForExit();"

WaitForExitを()関連付けられたプロセスが終了するまで現在のスレッドを待機させ:ないあなたはMSDNを参照してください

(あなたの説明ごとに)何をしたいです。プロセス上で他のすべてのメソッドが呼び出された後で呼び出される必要があります。現在のスレッドをブロックしないようにするには、Exitedイベントを使用します。

ループ内などで複数のインスタンスを実行する場合は、(追加のcmdプロセスを作成する)メインスレッドをブロックしないでください。

0

複数の呼び出しを実行する必要がある場合は、WaitForExit()がブロックされるため、別の戦略を使用する必要があります。

補完が発生したことを知る必要がない場合は、同期コンテキストを必要としないため、WaitForExit()を削除するだけです。

スレッドがプロセスを完了したことを知る必要がある場合は、スレッディングはオプションですが、多くのスレッドとプロセスを生成することは効率的ではありません.をハウスキーピングで活用して補完を追跡し、結論を伝えるイベント。

関連する問題