とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub

【.NET】プロセスを使った処理が入力待ちとなる現象を回避

Processクラスを使って、外部ファイルを実行中に
Enterキーの入力待ちとなり次処理にすすまなくなる事があった。

実行コードとしては以下のようなもの
・プロセスを作成し、外部プログラムを指定
・外部プログラムからの進捗状況を受け取り、UIに通知する
・プロセス終了時点で終了通知を受け取り、メインスレッド側で次処理を実行する

上記を行うにあたり、
Processクラスに渡すProcessStartInfoで重要な設定は次の通り

// シェル機能を使用しない
psInfo.UseShellExecute = false;
// 標準リダイレクト入力を不許可
psInfo.RedirectStandardInput = true;

これを行っておくことで、Enterキー等の入力を破棄して
プロセススレッド側でどんどん処理を行っていってくれるハズ。
ハズなんだけど・・・・

今回、C#.NET側からformat.comを実行したら
「準備ができたらEnterキーを入力して下さい」という進捗状況から一切動かなくなる現象を発見。
もちろん、メインスレッド側ではProcessクラスの終了待ちだし、
Process側では、メインスレッドからのEnterキー待ちとなりロックが発生。

プレーンなプロジェクトを作成したらなんなく次に進むのだけど、
手をつけているソリューション内では待ちになる・・・同一コードなのになぁ。

時間内に解決への糸口を見つけることができなかったので
疑似的にEnterキー入力を行うようにして回避した。

以下、実行コード



このサイトさん的にはこんなことをしなくても大丈夫なんだけどねぁ・・・
外部プログラム実行時に処理が固まる場合には?[2.0、C#、VB]

あとは、ここでも書き込んだ人が迷っていた模様
Processクラスの入力情報取得

にっちもさっちもいかないので
MSのこのあたりを読んで、解決。
ProcessStartInfo.RedirectStandardInput プロパティ
とにかく、入力ストリームにEnterを入れ込んでやろうぜ!的な発想です。

対応に問題点等あればコメントもらえるとうれしいです。

テーマ:プログラミング - ジャンル:コンピュータ

次のページ

FC2Ad