2011-07-25 13 views
1

私が達成しようとしているもの:asp.netページのコードの背後にある、長時間実行されているビジネスロジックメソッドを呼び出したいプロセスを非同期で実行させます。プロセスには、いくつかのビジネスオブジェクトがパラメータとして含まれています。プロセスが開始されると、ユーザーには結果が電子メールで送信されることを示す画面が表示されます。ここで重要なことは、ユーザーがプロセスが完了するまで待つ必要がないことです。これを行う最善の方法は何ですか?プロセスは既に存在し、私のプロジェクトで動作しますが、ページは実行中にハングアップします。ASP.NETはバックグラウンドで長時間実行されるメソッドを実行します

元は、メソッドをWebサービスに移動することを考えました。私は、シグネチャを同じに保ち、Webサービスビジネスオブジェクトを渡すつもりだったが、名前空間エラーが発生しています。具体的には、引数の型MyBusinessLogic.MyObjectは、My WebサイトとWebサービスが同じDLLを参照していても、MyWebService.MyObjectパラメータ型に割り当てられません。なぜ私はそれが起こっている得るが、私はそれの周りに道が必要です。

ソリューションの実際の実装は非常に重要ではありません。私が気づいていないASP.NETでメソッド呼び出しを非同期的に実行する方法があったらすばらしいでしょう。そうでない場合は、XMLパラメータリストを送信し、それをWebサービスのビジネスオブジェクトの私の唯一のオプションとして解析しますか?

+0

新しいスレッドを起動してプロセスを実行し、応答を返してユーザーを情報ページにリダイレクトするのはなぜですか? http://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx –

+0

ASP.Netではこのようなスレッディングはお勧めしません。正しい手順は、非同期ASP.Netページメソッドを使用することです。詳細はこちら:http://msdn.microsoft.com/en-us/library/system.web.ui.pageasynctaskaspx – Jeremy

答えて

1

私は私がやってしまったことはジェレミーの方法に近いかなり確信しています。

私はこのサイトを見つけました:http://www.codeproject.com/KB/cs/AsyncMethodInvocation.aspxこれはメソッドを非同期に呼び出す方法を説明しています。要約:プロキシを定義してProxyMethod.BeginInvoke(null、null)を呼び出すと、メソッドはコールバックなしで実行されます。つまり、fireとforgetがあります。それは私が本当に欲しかったものでしたので、私はそれをどうするつもりです。私はそれが必要かどうかはわかりませんが、メソッド自体を取り出し、コードビハインドからビジネスロジックに移動し、それを静的メソッドにしました。コードによって、次のようになります。

private delegate void AsyncReportGen(ReportParameterObject rpo); 
protected void GenerateReport() 
{ 
    //other code 
    AsyncReportGen reportGen = ReportGenClass.GenerateReportStaticMethod; 
    reportGen.BeginInvoke(rdo, null, null); 
} 

GenerateReportメソッドは、ボタンクリックイベントによって呼び出されます。 GenerateReportStaticMethodは、完了したレポートが添付された電子メールを送信します。 BeginInvokeによって呼び出されるメソッドは独自のスレッドで実行され、ページの読み込みが完了し、ユーザーに電子メールを受け取ることを示すメッセージが表示されます。ユーザーは引き続きサイトを使用したり、ブラウザを閉じたりできます。

+0

素晴らしいです。あなたがそれを分類しているのを見てうれしい。 – Jeremy

+0

今のところはね。このプロセスは頻繁に使用されるべきではありませんので、複数のスレッドがサーバーにオーバーロードする問題はありません。私たちは見るだろう。助けてくれてありがとう。 – William

1

私は同じ問題があるので、処理呼び出しをPre_Renderメソッドに移動し、処理中にフロントエンドでjs関数を呼び出して処理を更新します。

Response.Write("fnUpdate('Processing 1 to 30 files')"); 
Response.Flush(); 

処理ロジックを変更して、デリゲートを使用して進捗状況を更新する必要があります。

希望します。

EDIT: あなたは非同期ASP.netページを使用していることを確認しScript.Timeout

Server.ScriptTimeout = 3600; 
+0

処理が開始されたら、私は何が起こるか気にしません。私が望むのは、プロセスを開始してユーザーに電子メールを送信するように指示するページだから、ユーザーはその日について続けることができます。私は状態の更新や何らかの種類のものは必要ありません。しかし、助けてくれてありがとう。 – William

+0

その場合、私はキューイングシステムを実行します。したがって、ページはキューにタスクを追加し、キューを処理するスケジューラを持っています – ysrb

+0

サンプルへのリンクがありますか? – William

1
+0

これは私が必要とするものではないかと思います。これを行うと、非同期タスクが完了するまでページのロードが完了できません。タスクが解雇されたら、私はもうそれを気にしません。私はそれが実行中であることを忘れることができます。 – William

+0

スレッドを蹴り上げてタスクを実行するように、別の実行可能ファイルに伝えるためにメッセージングサービスを使用する可能性があります。これにより、IISワーカープロセスにスレッドが追加されることはありません。この記事を読むと、IISワーカープロセスのパラダイムが説明されます。 – Jeremy

+0

また、タスクパラレルライブラリを見てください。http://msdn.microsoft.com/en-us/library/dd537609.aspx – Jeremy

関連する問題