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

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QフレームのあるWeb画面から、フレームのないWeb画面への遷移方法

最初にお断りしておきますが、以下の質問は少し前にVBのカテゴリーで質問させて頂いたのですが、回答が得られなかったのと、後でよく考えたらASPの質問かな、と思ったのでASP側で質問させて頂く次第です。

VB.Net2003でWebシステムを開発している者です。画面遷移で困っており、詳しい方がおられたら教えて頂けないでしょうか。

開発中のシステムでは、まずログイン画面(フレームなし)を表示し、ログイン認証がOKとなった場合、業務画面(左右に分割したフレーム画面。左側はメニューで、右側はメイン画面)に遷移するようにしています。

ここまではなんとか実装できたのですが、「ログイン認証を行わず、ブラウザから業務画面(フレームあり)のURLを直接指定した場合、エラー画面(フレームなし)を表示したい」と考えています。

そのため、次のような実装を行いました。

(1)ログイン認証でOKとなった場合、業務画面に遷移する直前にセッション変数にセッションID(Session.SessionID)を設定する。

(2)業務画面(右側のメイン画面)のPage_Loadメソッドにて「(1)で登録したセッションID」と「Page_Loadメソッド実行時のセッションID(Session.SessionID)が異なっていれば、エラー画面に遷移(Response.Redirect(エラー画面))を行う。

上記実装後に、ログイン認証を行わずに業務画面(フレームあり)のURLを直接指定すると、フレームの右側のみがエラー画面となり、左側は表示されてしまいます。

フレームのある画面のロード時にチェックを行って、エラーとなった場合に、フレームのない画面を表示させるには、どのように実装すればよいのでしょうか?

以上よろしくお願いします。

最初にお断りしておきますが、以下の質問は少し前にVBのカテゴリーで質問させて頂いたのですが、回答が得られなかったのと、後でよく考えたらASPの質問かな、と思ったのでASP側で質問させて頂く次第です。

VB.Net2003でWebシステムを開発している者です。画面遷移で困っており、詳しい方がおられたら教えて頂けないでしょうか。

開発中のシステムでは、まずログイン画面(フレームなし)を表示し、ログイン認証がOKとなった場合、業務画面(左右に分割したフレーム画面。左側はメニューで、右側はメイン画面...続きを読む

Aベストアンサー

こういう理解でよいですか?
・認証を経ずに業務画面に来た場合、エラー画面に遷移させる。
・業務画面は本来はフレーム内であるが、エラー画面はフレームなしで表示させたい。(別画面ではない。)

この前提では、こういう解決方法もあります。
エラー画面に行く前にもう一ページはさんであげて、その<BODY>の中で…

<body>
<script language="javascript" type="text/javascript">
<!--
window.top.location = "[エラー画面]";
// -->
</script>
</body>

とすれば、エラー画面はフレーム無しで表示されます。
(他にも色々やり方はありますが)

こういうことで宜しかったですか?

QASP.NET による画面遷移で質問です。

はじめまして。
ASP.NETのC#で開発を行っていますが、画面遷移で困っています・・・
A画面 ⇔ B画面 ⇔ C画面 と遷移する場合と、
A画面 ⇔ C画面 へ遷移する場合があり、戻り先が操作により異なります。
その場合、遷移元の情報はどのように保持していいのでしょうか?

現在は、ページ情報(各種コントロール情報・遷移元画面名)クラスを作り、Listに格納しセッションにて保持しています。
しかしなが、使い勝手が悪く(作り方が悪いのか・・・)困っています。

一般的にはこのような画面遷移のシステムを作る際はどのように作成するものなのでしょうか?宜しくお願いします。

Aベストアンサー

>ASP.NETでのフレームワーク化
大したことではありません。
通常、汎用的でどうにでも作れるものを、一定の基準に沿うようにするだけです。

たとえば、データつきページ遷移なら、
基底クラス内メソッド PageTransfer("遷移先", (Dictionary<string.object>)持ち出しデータ) を定義、
遷移先ページで
Page_Load 以外に カスタムイベント Page_Transfered(object sender, TransferEventArgs e) を発生させるようにし、
 e.Parameters["xxId"] (持ち込んだパラメータ値)
 e.PreviousPage (前のページ)
などを参考にいろんなことをやり取りできるとか、そういった仕組みを作るだけです。
多少骨は折れますが、この程度なら3日見込めば大丈夫かと思います。

Q動的に作成したボタン(リンク)押下で画面遷移

ASPで開発をしているのですが、初心者故、頓珍漢なことを言っているかも
しれません。
ご指摘いただければありがたいです。

DBから値を取得して、データを動的に作成したテーブルに一覧表示しています。
各行には、編集・削除のボタンがあって、それを押すと、編集、または削除用の
画面へ遷移する仕組みにしたいと思っています。

テーブルについては、レコードセットで取得した値をループする時に、
Response.Writeで、<tr><td>rec("カラム名")</td></tr>のようにタグを書いています。
(recはレコードセットです)

このページを仮にASP1とすると、ボタンを押したら、その行の値を保持して、
編集用のページ(ASP2とします)へ遷移したいのですが、値の保持の方法が
わからず困っています。
Request.Formとかで、遷移先のページで値を受け取れるようですが、
各行ごとの値をどうやって詰めてあげたら良いのでしょうか。

稚拙な説明で申し訳ないのですが、ご教授ください。
また、詰めたい値は、2、3個ですので、セッション?とかクッキーを使うような
ものではなく、可能な限りシンプルな方法ですとありがたいです。

宜しくお願いいたします。

ASPで開発をしているのですが、初心者故、頓珍漢なことを言っているかも
しれません。
ご指摘いただければありがたいです。

DBから値を取得して、データを動的に作成したテーブルに一覧表示しています。
各行には、編集・削除のボタンがあって、それを押すと、編集、または削除用の
画面へ遷移する仕組みにしたいと思っています。

テーブルについては、レコードセットで取得した値をループする時に、
Response.Writeで、<tr><td>rec("カラム名")</td></tr>のようにタグを書いています。
(recはレコードセットで...続きを読む

Aベストアンサー

遷移先のページで対象レコードを再取得すれば?
主キーを渡すだけで済むでしょ。

ASP2.asp?id=xxxxxx
てな感じで遷移先のページにリンクをしておく。

ASP2.asp では Request.QueryString("id") でレコードの主キー値を取得。
DB からそのレコードだけを再取得してページに出力。
[更新] みたいなボタンで DB に書き出す。

QASPX.CS ではなく単体CSからの画面遷移

ASP.net C#.net 1.1

通常、ASPXに付随するCS内にて、画面遷移を行う場合

this.Response.Redirect("main.aspx");

と言う形で、画面遷移しているのですが、

同様な目的で、ASPXに付随しない「単体のCS」内で「画面遷移」が実現できず

大変困っております、ご存知のかたご教授ください。


以上よろしくお願いします。

Aベストアンサー

System.Web.HttpContext.Current.Response.Redirect("main.aspx");


蛇足ですが……
「デザインとロジックの分離」についてお聞きになったことはおありでしょうか?
今回のように、ページの表示・遷移に直接影響する処理を、デザインとは関係ない一クラスに含めるやり方はあまり感心しません。
(処理の流れがわかりにくくなったりするため、保守性が下がります)

メソッドの返り値を見て、aspx側でthis.Response.Redirectするように設計すべきです。

QASP VBScriptでスクリプト実行を終了

ASP VBscript においてPHPでのdie()やexit()に相当する関数はありますか?

Aベストアンサー

PHPのexit()のように、終了コードを返す概念はないのですが、
処理を終了させるという意味では、Response.End が近いものかなと
思います。

ご参考になれば幸いです。


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

おすすめ情報