- ベストアンサー
Process.Startの戻り値を後で取得
- Process.Startで外部exeを実行しており、結果を待たずに次の画面に遷移したい。しかし、WaitForExitを使用しない場合はどのようにして結果を取得するのかわからない。
- Processを実行した画面以外で結果を受け取りたい場合、プロセスIDを取得し、セッションに持たせて終了を判断する方法も考えているが、戻り値を突き止める方法がわからない。
- ASP.NET開発の経験は1ヶ月半程度で、現在、Process.Startを使用して外部実行ファイルを実行している。処理が終了したら結果画面に遷移させたいが、結果を待たずに次の画面に遷移する方法がわからない。
- みんなの回答 (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)の組み合わせをデータベースで管理する。
その他の回答 (1)
- onos
- ベストアンサー率81% (127/155)
> WaitForExit( ) をしない場合、どのようにして取得できるのでしょうか。 Profess.Startを利用する限り、これ以外の方法はないと思います。 ASP.NETの中で非同期に処理を実行するための仕組み、というものが存在しています。 この仕組を利用して、外部の処理にあたる部分をどう組み込んでいったらいいか、というように考えていったほうがいいと思います。
お礼
ONOS様、いつもありがとうございます。 Process.Startで実行した処理の結果をどうとるかではなく、 そもそもの呼び方から考えるべきだったのですね。 具体的な方法の例を他の回答者様からも頂き、 何とか実現できそうです。ありがとうございました。
お礼
todo36様、ありがとうございます。 簡単なのは1,4 許される条件によっては2,3、でしょうか。 そもそもの考え方から外れていまして、 どつぼに嵌っていたので本当に助かりました。 おかげさまで目的の結果を受け取る事が出来ています。 ありがとうございました。