svn.exe
リポジトリからデータを取得するために呼び出す外部プロセスを作成する .NET4 コマンドライン アプリケーションを拡張しています。問題は、アカウントのパスワードが変更されると、認証が失敗し、SVN がアカウントのパスワードを要求することです。
SVN は、プロンプトを標準エラーに書き込むことでこれを行います。出力は次のようになります。
STDOUT: '.' を更新しています: STDERR: 認証領域: <http://{host}:8080> VisualSVN サーバー STDERR: 「joe.smith」のパスワード:
私が間違っていると思うのは、子プロセス (CP 以降) の 2 番目の「行」に改行が含まれておらず、親プロセス (PP) が標準入力でブロックされる前に、おそらくBeginErrorRead Line ()によって取得されていないことです。ストリーム。私の推測は、CP で入力ストリームを閉じると、出力ストリームとエラー ストリームの両方からの残りのデータがDataReceivedEventHandlerコールバックによって処理されるという事実によって裏付けられます。
イベントのシーケンスは次のように表示されます。
- CP は STDOUT への書き込みを開始します。
- キャッシュされた認証資格情報が間違っている場合、CP は上記のメッセージを STDERR に書き込み始めます。
- STDERR から同期的に読み取るか非同期的に読み取るかに応じて、次のことが起こります。
- 同期: CP は STDIN からの入力を待っているように見えますが、PP は STDERR からの追加データを待っています。ストリームが閉じているかどうかを覗いたり確認したりするだけでも、デッドロックが発生します。
- 非同期: CP がその STDIN からの読み取りを待機する前に、2 番目の行は読み取られません。
問題を正しく診断したと仮定すると、どうすればよいかまだ途方に暮れています。
私が試みたオプションについては:
- この MSDN の記事に従って、標準エラーからの同期読み取りを試みました。標準エラーから最後の文字を読み取るとすぐにメソッドが無期限にブロックされるため、これは危険を伴うように見えました。
- 前のリンクでは、「別の方法として、2 つのスレッドを作成し、各ストリームの出力を別のスレッドで読み取ることで、デッドロック状態を回避できます」ともアドバイスされています。、しかし、この道に沿った私の努力は明らかに見当違いでした。ストリームの終わりに達したことがわかったときには手遅れである場合、スレッドがどのように役立つかわかりません。
明確にするために、デッドロックを引き起こさずに標準エラーストリームの最後まで安全に読み取るにはどうすればよいですか?