• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Process.Startの戻り値を後で取得)

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

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

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

  • ベストアンサー
  • 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で実行した処理の結果をどうとるかではなく、 そもそもの呼び方から考えるべきだったのですね。 具体的な方法の例を他の回答者様からも頂き、 何とか実現できそうです。ありがとうございました。