2009-06-29 16 views
1

私はC#で代替Windowsシェルを作成しています。現在実装している機能は、同じシェルウィンドウ内にすべてのIOを持っています。C#Shell - IOリダイレクト

今、出力する部分的な解決策があります。これは(pは、実行中のプロセスである)私のコードである:

while (!p.HasExited) { 
    /* ... - irrelevant */ 
    if (redirect) { 
     try { 
      p.BeginOutputReadLine(); 
     } catch { } 
    } 
} 

処理が全て正しいプロパティで設定され、= FalseなどUseShellExecuteRedirectStandard{Input, Output, Error} = True、およびイベントハンドラが正しく設定されています、それは矛盾している。

私はtry/catch(私は非常に悪い習慣であることがわかっています)を取り出して、ハンドラが実行されたときにfalseに設定されたbusy boolを使用しましたが、何らかの理由でまだInvalidOperationException p.BeginOutputReadLine() - 既に非同期操作が実行中であることを示します。

上記のものとまったく異なる解決策が必要な場合でも、それを固定するのではなく、助けてください。

ありがとうございました。

EDIT:ここでは、プロセスを開始するコードです。また

if (redirect) 
{ 
    p.StartInfo.RedirectStandardOutput = true; 
    p.StartInfo.RedirectStandardError = true; 
    p.StartInfo.RedirectStandardInput = true; 
    p.StartInfo.UseShellExecute = false; 
    p.OutputDataReceived += new DataReceivedEventHandler(redirectHandler_StdOut); 
    p.ErrorDataReceived += new DataReceivedEventHandler(redirectHandler_StdErr); 
} 
p.Start(); 

が、私は一貫性のないことで何を意味するか説明していないよことに気づきました。通常、非同期で実行開始を前に付け

screenshot

+0

プロセスを開始するコードはどのように見えますか? –

+0

私はちょうど今質問を更新するでしょう:) –

答えて

3

方法:彼らが言うように、絵は2^3の言葉の価値があります。これは、あなたの望むことですか?ループは可能な限り速く実行されるように見えるので、BeginOutputReadLineがますます呼び出されます(呼び出しが完了する前にすぐに戻り、ループが別の繰り返しのために戻るため)。

同期ソリューションのStandardOutputストリームでReadLineを呼び出すことができます。または:

while (!p.HasExited) { 
     /* ... - irrelevant */ 
     if (redirect && !busy) { 
      try { 
       busy = true; 
       p.BeginOutputReadLine(); 
      } catch { } 
     } 
    } 
    ////In the method that gets called upon completion of BeginOutputReadLine 
    busy = false; 

(MSDNから)けれども、この点に注意してください:非同期読み取り操作 開始は、イベント・ハンドラは、その都度 呼び出されると

関連するプロセス はの行を書き込みテキストを 標準出力ストリームに追加します。

の非同期読み取り操作をキャンセルするには、CancelOutputReadを呼び出します。 読み取り操作は、 呼び出し元またはイベントハンドラによって取り消すことができます。 キャンセル後、 BeginOutputReadLineを再度呼び出して、 非同期読み取り操作を再開することができます。

これは、このメソッドを1回だけ呼び出す必要があり、行が書き込まれるときにコールバックを介して通知し続けると思います。

+0

私はこれも問題であると信じています。それはちょうど私に起こったが、あなたはすでに私のためにそれを書いた:) –

+0

それはちょうどtry..catchから除いて、私が試したことです - 私はそれを追加します。あなたはBeginOutputReadLine一度?それとも、すべての行の後に再開する必要がありますか? –

+0

(この質問ではなく、申し訳ありません!)私は、インバイトウェッブ上にあるものとそうでないものを覚えておく必要があります。 –

関連する問題