dポイントプレゼントキャンペーン実施中!

お世話になっております。

【環境】
作業マシン:WINDOWS Server2008 (仮想)
開発ツール:VWD2010(VB)
使用DB:SQLServer2008R2
Webフォームにてアプリを開発しております。
ASP.NET VBでの開発の経験はおおよそ4ヶ月程です。

【質問内容】
コマンド実行し、その際プロンプトに表示される結果文字列を、
下記を参考に取得しています。
http://dobon.net/vb/dotnet/process/standardoutpu …

実行しているのは処理終了までに5分くらい掛かるexeで、
10秒毎に現在の処理進捗率を吐きます。
ですが現在はプロセスが終了するまで結果の参照ができません。

参考URL先にあります、
[プロセス名].StandardOutput.ReadToEnd
この取得方法ではプロセスの終了まで待たねばなりません。
完了していないプロセスのoutput を参照するには
どのようにすればよいのでしょうか。

何卒ご教授下さい。

A 回答 (2件)

    • good
    • 0
この回答へのお礼

todo36様

ありがとうございます。
プロセスの終了を待たない、という点で
以前に相談した質問と同じ考え方が出来たのですね。
今回は(リンク先スレッドで教えて頂いた)3番の方法、
非同期のスレッドを立てる方法で実現が出来ました。

1.メインスレッドでExeを実行。
2.リダイレクト処理を続けるサブスレッドを作成し、
  リダイレクトされた内容をOutputreadlineで1行ずつ取り
  セッション変数 (session("templog")) に格納。
3.メインスレッド側は定期的に session("templod") を参照し、画面を更新。
4.Exeを実行したプロセスが終了していたら、画面更新を終了

と、いったコードを書くことで、
目的である未完了のプロセスのリダイレクト表示
(現在実行中であることと、その進度の表示)を得る事ができました。
ありがとうございました。

お礼日時:2012/08/26 16:53

>参考URL先にあります、


>[プロセス名].StandardOutput.ReadToEnd
>この取得方法ではプロセスの終了まで待たねばなりません。
>完了していないプロセスのoutput を参照するには
>どのようにすればよいのでしょうか。

StandardOutputプロパティのReadToEndメソッドではなく、
BeginOutputReadLineメソッドで非同期読み込みにしてみてはどうでしょうか?
使い方に関しては…
http://msdn.microsoft.com/ja-jp/library/system.d …
の解説を。

この回答への補足

ご報告です。非同期でのリダイレクト取得が出来ました。
ありがとうございます。しかし、実は根っこの目的というのが

>処理終了までに5分くらい
>10秒毎に現在の処理進捗率を吐きます
このプロセスの現在の進捗を定期的に画面に表示
することなのです。

Outputreadlineの中身をセッションに持てば、
後は定期的に格納先の変数をみればよい、
と、考えて居たのですが画面を1度でも返した時点で
サーバーコントロールも終了してしまい、
続きを取得・表示することは出来ませんでした。

この目的を果たすためには、何か他の方法を考える必要がありそうです。

補足日時:2012/08/21 12:44
    • good
    • 0
この回答へのお礼

ありがとうございます。
少々難しく、未だ目的を果たすコードはかけておりませんが、
リンク先の解説やサンプルを参考に試してみます。

お礼日時:2012/08/20 18:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!