
お世話になっております。
作業マシン: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を頼りに、
終了したプロセスの戻り値を突き止める方法も見つからず
(発想自体が間違っているかもしれません)
皆様のお力を貸して頂けないでしょうか。何卒よろしくお願いします。
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)の組み合わせをデータベースで管理する。
todo36様、ありがとうございます。
簡単なのは1,4
許される条件によっては2,3、でしょうか。
そもそもの考え方から外れていまして、
どつぼに嵌っていたので本当に助かりました。
おかげさまで目的の結果を受け取る事が出来ています。
ありがとうございました。
No.1
- 回答日時:
> WaitForExit( ) をしない場合、どのようにして取得できるのでしょうか。
Profess.Startを利用する限り、これ以外の方法はないと思います。
ASP.NETの中で非同期に処理を実行するための仕組み、というものが存在しています。
この仕組を利用して、外部の処理にあたる部分をどう組み込んでいったらいいか、というように考えていったほうがいいと思います。
ONOS様、いつもありがとうございます。
Process.Startで実行した処理の結果をどうとるかではなく、
そもそもの呼び方から考えるべきだったのですね。
具体的な方法の例を他の回答者様からも頂き、
何とか実現できそうです。ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(動画サービス) 海外のポルノ動画をみていて「お好みに」入れて置くと画面により「待機・ページ終了」表示で動かなくなる 1 2022/12/30 19:37
- JavaScript [Java] Edgeでのアドレスバー非表示について 3 2022/04/20 17:51
- ノートパソコン タブレット(dynapadN72)を知人に譲る時、どうしたら・・・ 4 2023/06/23 15:31
- iCloud AppleID サポートからのメール 3 2023/07/05 15:14
- その他(ソフトウェア) F-BASICで計算中の実行が中途で勝手に止まり、大変困っています。 2 2023/03/02 16:15
- Windows 7 更新プログラムを入れたら操作出来なくなりました(泣) 1 2023/02/26 11:04
- その他(gooサービス) dアカウントを登録できません 1 2023/03/03 23:35
- Windows 10 windows10のクリーンインストールが完了出来ない 2 2022/06/04 13:33
- 中途・キャリア 転職活動における最終面接につきまして 2 2023/05/31 17:16
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
このQ&Aを見た人はこんなQ&Aも見ています
-
C#でのbatファイル実行結果取得
その他(プログラミング・Web制作)
-
VB.NETで他のEXEを実行させる
Visual Basic(VBA)
-
exe間での引き値の受け取り方法
Visual Basic(VBA)
-
-
4
VB.Netでファイル圧縮する方法は何ですか?
Visual Basic(VBA)
-
5
C# Process.Startメソッドで複数引数を渡したい
その他(プログラミング・Web制作)
-
6
VB.net 任意の例外を発生させるには・・・
Visual Basic(VBA)
-
7
DoEventsがやはり分からない
Visual Basic(VBA)
-
8
ファイルを処理中に次の処理に移ってしまうようなのですが、、
Visual Basic(VBA)
-
9
VB.NETでのイベントの途中終了
Visual Basic(VBA)
-
10
SQLServer sqlcmdが使えない
SQL Server
-
11
SPREAD(GrapeCity)のセルにフォーカスを設定するにはどうしたらいいのでしょうか?
Visual Basic(VBA)
-
12
コンソールアプリケーションのコマンドプロンプト画面を非表示
Visual Basic(VBA)
-
13
CloseとDisposeの違い
Visual Basic(VBA)
-
14
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
15
VB2010でExcelの行をコピーして挿入する
Visual Basic(VBA)
-
16
VB.net 引数で配列変数を渡す際の要素数
Visual Basic(VBA)
-
17
VB.NET 自プログラムのプロセス終了のイベント
Visual Basic(VBA)
-
18
外部exeに対しての引数受け渡し
Visual Basic(VBA)
-
19
【DB】同じトランザクション内でupdateとselectをしたときの結果値
その他(データベース)
-
20
VBScriptでコマンドプロンプトウィンドウを開いたままにしたいです
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
explorer.exeが異様にメモリを食う
-
UNIX関数?(popen)...
-
c言語でプロセスIDを調べたい
-
jcode.plの共有
-
Process.Startの戻り値を後で取得
-
Form_closing中でのCancel処理
-
書きのパイプを「親」と呼ぶ理由
-
VB6.0 SHELLで起動...
-
jdbcのプロセスの処理について
-
C++のプログラムをバックグラウ...
-
プロセスのタイトル
-
POSIX メッセージキュー作成時...
-
共有メモリを使う場合のCPU負荷...
-
さっそくのご回答ありがとうご...
-
windowsのプロセスIDやスレッド...
-
telnetの強制終了について!
-
cvLoadImageを使用するとプロセ...
-
大量データの受け渡し
-
gnome関数の戻り値について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
プロセスIDの取得方法について
-
ADOでアクセスのレコードに...
-
C#でのbatファイル実行結果取得
-
タスクマネージャーのプロセス...
-
VB6.0 SHELLで起動...
-
プロセスのアタッチ・デタッチ...
-
非表示になったエクセルは?
-
怪しいプロセス教えてください。
-
sleep関数の精度について
-
【C#】別プロセスがロックか...
-
Process.Startの戻り値を後で取得
-
IISがフリーズ
-
プロセスIDからウィンドウハ...
-
Linuxでのスレッド間メッセージ...
-
Windowsでのfork方法
-
SendMessageが失敗するときがある
-
警告『 別のプロセスで使用され...
-
WSH.Runで待機できません
-
VB.NETで起動したExcelの閉じ方...
おすすめ情報