プロが教える店舗&オフィスのセキュリティ対策術

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

作業マシン: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を頼りに、
終了したプロセスの戻り値を突き止める方法も見つからず
(発想自体が間違っているかもしれません)
皆様のお力を貸して頂けないでしょうか。何卒よろしくお願いします。

A 回答 (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)の組み合わせをデータベースで管理する。
    • good
    • 0
この回答へのお礼

todo36様、ありがとうございます。
簡単なのは1,4
許される条件によっては2,3、でしょうか。

そもそもの考え方から外れていまして、
どつぼに嵌っていたので本当に助かりました。
おかげさまで目的の結果を受け取る事が出来ています。
ありがとうございました。

お礼日時:2012/06/29 00:26

> WaitForExit( ) をしない場合、どのようにして取得できるのでしょうか。



Profess.Startを利用する限り、これ以外の方法はないと思います。

ASP.NETの中で非同期に処理を実行するための仕組み、というものが存在しています。
この仕組を利用して、外部の処理にあたる部分をどう組み込んでいったらいいか、というように考えていったほうがいいと思います。
    • good
    • 0
この回答へのお礼

ONOS様、いつもありがとうございます。

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

お礼日時:2012/06/29 00:13

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A