Process.Startの戻り値を後で取得

このQ&Aのポイント
  • Process.Startで外部exeを実行しており、結果を待たずに次の画面に遷移したい。しかし、WaitForExitを使用しない場合はどのようにして結果を取得するのかわからない。
  • Processを実行した画面以外で結果を受け取りたい場合、プロセスIDを取得し、セッションに持たせて終了を判断する方法も考えているが、戻り値を突き止める方法がわからない。
  • ASP.NET開発の経験は1ヶ月半程度で、現在、Process.Startを使用して外部実行ファイルを実行している。処理が終了したら結果画面に遷移させたいが、結果を待たずに次の画面に遷移する方法がわからない。
回答を見る
  • ベストアンサー

Process.Startの戻り値を後で取得

お世話になっております。 作業マシン:WINDOWS Server2008 (仮想) 開発ツール:VWD2010(VB) 使用DB:SQLServer2008R2 にて、Webアプリを開発しております。 ASP.NET開発の経験はおおよそ1ヶ月半程です。 現在、Process.Startで外部exeを実行しております。 この外部実行ファイルは3分くらい掛かる処理で、 WaitForExit() で結果を待たずに 次の画面(待機用画面)に遷移しています。 処理が終了したら、待機画面から結果画面へと遷移させたいのですが、 プロセスの完了と、その結果(戻り値)を、 Process.Startをコールした画面以外で受け取る事が出来るのでしょうか。 WaitForExitを使用するならば、 素直に終了を待ち、終了後にExitCodeを取得、 Ret = Process.Start() で戻り値も取得できましたが… WaitForExit( ) をしない場合、どのようにして取得できるのでしょうか。 http://dobon.net/vb/dotnet/process/openfile.html こちら等、Process.Start 非同期 などのキーワードで出てくるのは Processを実行した同画面内での待機のケースが多く、 今自分が遭遇しているケースに応用するには どうにも自分の理解が追いつけず質問いたします。 実行する画面でプロセスIDを取得し、セッションに持たせ、 終了を判断したい画面でプロセスIDを元にチェックをする… と言うことも考えてみましたが、プロセスIDを頼りに、 終了したプロセスの戻り値を突き止める方法も見つからず (発想自体が間違っているかもしれません) 皆様のお力を貸して頂けないでしょうか。何卒よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

案1) Process.Startの戻り値をSessionに保持する。 → SessionがInProcモード以外だと問題 (案2) (sessionID, Process)の組み合わせを独自の辞書で管理する。 // (sessionID, Process)の組み合わせを保持する辞書 private static Dictionary<string, Process> dic = new Dictionary<string, Process>(); → Processクラスを別のPageスレッドで参照していいのか? MSDNではスレッドセーフが保障されない。 (案3) 別スレッドでEXEを起動する。 (sessionID, ExitCode)の組み合わせを独自の辞書で管理する。 public static class MyProcess { // (sessionID, ExitCode)の組み合わせを保持する辞書 private static Dictionary<string, int> dic = new Dictionary<string, int>(); public static void Start(string sessionID, ProcessStartInfo info) { dic[sessionID] = int.MinValue; //待機中 //Pageスレッドと別スレッドでEXEを起動 BackgroundWorker bw = new BackgroundWorker(); bw.DoWork += delegate { Process p = Process.Start(info); p.WaitForExit(); dic[sessionID] = p.ExitCode; }; bw.RunWorkerAsync(); } public static int? GetExitCode(string sessionID) { if (dic.ContainsKey(sessionID)) return dic[sessionID]; //int.MinValue:待機中, 以外:終了コード else return null; //未起動 } public static void Clear(string sessionID) { if (dic.ContainsKey(sessionID)) dic.Remove(sessionID); } } (案4) (sessionID, ExitCode)の組み合わせをデータベースで管理する。

wendy0303
質問者

お礼

todo36様、ありがとうございます。 簡単なのは1,4 許される条件によっては2,3、でしょうか。 そもそもの考え方から外れていまして、 どつぼに嵌っていたので本当に助かりました。 おかげさまで目的の結果を受け取る事が出来ています。 ありがとうございました。

その他の回答 (1)

  • onos
  • ベストアンサー率81% (127/155)
回答No.1

> WaitForExit( ) をしない場合、どのようにして取得できるのでしょうか。 Profess.Startを利用する限り、これ以外の方法はないと思います。 ASP.NETの中で非同期に処理を実行するための仕組み、というものが存在しています。 この仕組を利用して、外部の処理にあたる部分をどう組み込んでいったらいいか、というように考えていったほうがいいと思います。

wendy0303
質問者

お礼

ONOS様、いつもありがとうございます。 Process.Startで実行した処理の結果をどうとるかではなく、 そもそもの呼び方から考えるべきだったのですね。 具体的な方法の例を他の回答者様からも頂き、 何とか実現できそうです。ありがとうございました。

関連するQ&A

  • 他のコンピュータのプロセスを取得

    VB2005Expressにて開発しています。 他のコンピュータで実行中のプロセスを取得したいと思っています。 Dim ps As System.Diagnostics.Process() = _ System.Diagnostics.Process.GetProcesses("プロセス名","192.168.XXX.XXX") で指定したコンピュータからプロセスは取得することは出来ました。 ただ、特定のコンピュータだけ「リモート コンピュータに接続できませんでした。」というエラーが出てしまいます。 プログラムの実行環境のID、パスワードと特定のコンピュータの IDとパスワードが異なっているのが原因だと思っています。 GetProcessesにIDとパスワードを設定してプロセスを取得することは 可能なのでしょうか。 ご存知の方がいらっしゃいましたらご教授下さい。 よろしくお願いします。

  • プロセスIDの取得方法について

    下に同様の質問をしたのですが、削除方法分からない為、再度質問させていただきまし。 VB5.0を利用しています。 VBで書いたexeを実行した際に、そのプロセスID(自分の)は、GetCurrentProcessIdを利用すれば取得できると分かりました。 が、プログラム内でExcelを下記の様にオブジェクトを作成した場合、そのプロセスIDをどうやって取得すればいいのでしょうか? ご存知の方居ましたら、教えて下さい。 Set ExcelObj = CreateObject("Excel.Application") ここで起動?されたExcelのプロセスIDを取得したいのですが。

  • サーバ内のプロセスを取得するには?

    こんにちは! VB.netでサーバで起動しているexeを、ローカルから停止したいのですが、肝心のサーバ内のプロセスIDを取得できません・・・ System.Diagnostics.Processはローカルのプロセスしか取得できないのでしょうか? どなたかネットワーク全体のプロセスを取得できるコードをご存知でしたら、教えて下さいm(_ _)m よろしくお願い致します。

  • FindWindowの戻り値が違う!?

    いつもお世話になっております。 FindWindowの戻り値についてご教授願います。 ret = FindWindow(NULL,"sample"); 上記を実行した場合、取得する画面がアクティブの時と非アクティブの時でFindWindowの戻り値が違うのは何故でしょうか? 私は、sample画面が非アクティブでもアクティブ状態の時と同じハンドルが取得したのですが、良い方法は有りますでしょうか? 取得画面タイトル:sample 実行ファイル名:sample.exe 実行環境:WindowsXP 開発環境:VC++ 6.0

  • WEBサーバーに文字列を送り戻り値取得

    WEBサーバーに文字列送信の開発を行っています。 開発環境はVB6(アプリ部分)+VB2005(DLL部分)です。 文字列生成はVB6でしています。 サーバーに文字を送るところは.netでDLLを作っています。 VB6はそのdllを参照し関数をcallしています。 送信した文字列に何か不備等があればサーバーから1から5までのエラー区分が返ってくるのですが、戻り値を取得することができません。 どうすれば取得できるのでしょうか? <<サーバーとの通信方法>> サーバーに文字列を送るのはWebClientのUploadStringAsyncを使用しています。 サーバー側で文字列が送られているのは確認できています。 サーバーの戻り値を取得するのはUploadStringCompletedイベントで取得していますが、 通信が終わりVB6側に戻ってきた時にUploadStringCompletedイベントが起きているらしく戻り値を取得できません。 どなたかご教授いただければと思います。

  • Processで"<"の使用方法

    VC++2005の外部ファイルの実行で質問です。 バッチ(.bat)ファイルやコマンドプロンプトで実行する際に、 test.exe command < text.txt のように実行する実行ファイルを Processで実行するにはどうしたらいいのでしょうか? 現在、他の引数と同様に、 Process^ process1 = nullptr; ProcessStartInfo^ startInfo = gcnew ProcessStartInfo("test.exe"); startInfo->WindowStyle = ProcessWindowStyle::Normal; startInfo->Arguments = "command < text.txt"; process1 = Process::Start( startInfo ); process1->WaitForExit(); のような書き方をしてるのですが、正しく実行されません。 何か別の方法があるのでしょうか? C++はそんなに詳しくないですので、初心者に教えてように説明して頂けると助かります。 よろしくお願いします。

  • プロセスがタスクマネージャーに残るのは、なぜ?

    vbのプログラムから、GetExitCodeProcessとDo Whileを使用し外部プログラム(メモ帳など)の実行、監視しています。何かの表示しに、外部プログラムが終了しているにもかかわらず終了コードが取れないことがあり、タスクマネージャーを見ると、プロセスが残っている状態です。 なぜ、終了コードが取れずに、プロセスが残るのでしょうか? 何か参考があればよろしくお願いします。

  • CreateProcess関数と実行後の戻り値について

    VB6からCで作られたEXEを実行した戻り値を取得したいのですが どのように記述すればよいのでしょうか? 制御が戻るまで固まらずに待ち続けるには CreateProcessを使うと良いとは思いますが、 notepadなど一方的に動作させて終了するようなサンプルしかなく、 戻り値を取得するサンプルは見当たりませんでした。 戻り値といってもCのEXEは結果を標準出力で表示されるものですが・・・ 何か良いサンプルはあるでしょうか? CreateProcessを使わない方法でも構いません。 r = CreateProcess( _ cmd, _ param, _ ByVal 0&, _ ByVal 0&, _ 0, _ NORMAL_PRIORITY_CLASS, _ ByVal 0&, _ vbNullString, _ si, _ pi _ )

  • 実行結果を戻り値で取得したい

    MS-DOSバッチの実行結果を文字列で取得したいです。 イメージ例としては、下記のようなバッチ2つがあり、 バッチAを起動します。そうすると実行結果の戻り値として 「TEST」という文字列が取得できたら良いです。  ※下記例では「ERRORLEVEL」に入っているようなイメージです。 しかしながら、ERRORLELVEに格納できるのは数値のみの為、 エラーになってしまいます。 どうすれば、実行結果を戻り値で取得できるでしょうか? お手数ですが、MS-DOSで不可能な場合、VBScriptやWSHでも かまいませんので、処理をキックしてその戻り値を文字列で取得する方法を お教えください。お願いいたします。 -------------------------------- 例 【バッチA】 call バッチB echo %ERRORLEVEL% 【バッチB】 exit /b "TEST" -------------------------------- と実行し

  • C#でMediaPlayerを立ち上げた後

    お世話になります。 C#(.Net 4.0)で、MediaPlayerをコントロールでフォーム等に 張り付けるのではなく、System.Diagnostics内の Process.Start("wmplayer.exe","再生ファイル")で 外部プログラムとしてmp3や動画を開いたときに、 再生が終了(最後まで再生し終わったら)したら、 自動でMediaPlayerを終了させたいのですが、 その方法はありますでしょうか。 現在のコードはこうなっています(usingは省略)。 private void button1_Click(object sender, EventArgs e) { Process p = Process.Start("wmplayer.exe", @"C:\Users\hoge\Documents\abcde.mp4"); p.WaitForExit(); } 特に何の変哲もない、外部プログラムの起動ですが、 自動で閉じてもらわないと、下のWaitForExitに処理が回りません。 対策をお願いいたします。

専門家に質問してみよう