2011-01-24 19 views
5

Webアプリケーションがあり、コードビハインドページにボタンのクリックイベントがあります。C#Webアプリケーションでのスレッディング問題

protected void btnUpload_Click(object sender, EventArgs e) 
     { 
      TimerEvent TE = new TimerEvent(); 
      TE.TimerEvents(); 
      Server.Transfer("~/Jobs.aspx"); 
     } 

私はメソッド呼び出しTimerEvents()を持っており、コントロールをサーバー転送に戻すのに10-15秒かかることがあります。私は、メソッド呼び出しと同時にサーバ転送ラインを同時に実行したい。

私はここのようにスレッドを試みた:

TimerEvent TE = new TimerEvent(); 
    Thread t = new Thread(TE.TimerEvents); 
    t.IsBackground = true; 
    t.Start();   
    Server.Transfer("~/Jobs.aspx"); 

しかし、方法が終了するまで転送は、行われていません。 これをどうすれば実現できますか?

+0

ではないことを法が取っている場合は、「完了」されるまで「処理」として、各ジョブ最適化はメソッド内になければなりません。スレッドを作成することで、メソッドをより高速に戻すことはできません。メソッドのコードを貼り付けることは可能ですか? – Jagannath

+0

このメソッドは、新しいファイルのフォルダをポーリングすることになっています(新しいファイルは、そのフォルダにアップロードしている入力ファイルの処理後にそのフォルダに配置されるため、処理が最適化できない場合がありますそれはmatlabファイルであり、時間が必要です)。そして、私はユーザーが10-15秒待つことができません。したがって問題です。 – superstar

答えて

4

このデザインは理想的ではありません。もしあなたがそれを正しく取ったとしても、マルチスレッドコードとServer.Transfer()呼び出しが混在するため、問題が発生する可能性があります。

ASP.NETアプリケーションのマルチスレッドに関する問題もあります。

長持ちするタスクをキューに入れるような種類のキューを持つように、あなたのアプリケーションを再設計することをお勧めします。その後、キュー内のタスクを1つずつ処理するサービスを持つことができます。

  1. キューまで、外部サービスへの実行時間の長いTimerEventsタスク:Webアプリケーションから

    は、あなたが今することができます。

  2. コールServer.Transferを()

  3. 新しいページ( "〜/ Jobs.aspx")には、あなたがそれを必要とするとき、あなたの結果をピックアップして外部サービスを呼び出します。あなたはGlobal.asaxの(アプリケーション)ファイルからsperateスレッドでプロセスをsettupない理由を「アプリケーションイベントを」と呼ぶもの

+0

私はあなたのポイントを見ます。任意の参照を使用してキューと外部サービスを詳しく説明できます。ありがとうございました – superstar

+0

実際に私は提案したアイディアが好きになりました。これについての詳細は私には非常に役立ちます。ありがとうございました。 – superstar

+0

考え方は、外部サービスが要求を配置できる格納場所をポーリングすることです。ほとんどの開発者は、単にrequest_id、request_date、status、およびrequestカラムを持つデータベーステーブルを使用します。ただし、XMLファイルをディスクに保存するか、MSMQを使用して同じことを達成できます。サービスは記憶場所をポーリングし、要求を処理して結果を通知し、次の要求に移ります。後で呼び出した人は、リクエストの結果を*結果エリア*(または単にDBテーブルのステータスカラム)でチェックすることができます。 – tenor

0

プロセスは、多くの場合、同様の方法で繰り返されている場合は、。 FileWatcherクラスを使用してディレクトリを監視し、ファイルを順番に処理したり、ファイルが到着するたびに別のプロセスを独自のスレッドで起動したりすることで、ステータスや結果を保持し、AJAX時間を使用してクライアントに公開することができます折り返し電話。

すべての例外を正しく処理するには、Global.asax ファイルから呼び出されたメソッドで、appDomain全体を停止させる必要があることに注意してください。

Global.asax

0

一番簡単な方法:私はちょうどすぐに戻って、「あなたはファイルがアップロードされています」が、その後あなたの「jobs.aspx」のページに自動リフレッシュを行うとのステータスを表示すると言うでしょう それは

仮定jobs.aspxがあなたの処理ジョブのリストです...と「自動リフレッシュ」はあまりにもjanky :)

関連する問題