2010-12-07 13 views
1

私は、文書の単語を数えるWebアプリケーションを持っています。かなり長い時間がかかります。私はそれをページに分割し、別のスレッドの各ページのメソッドを呼び出しました。私はスレッドプールを使用していますasp.netタイマを使ったマルチスレッド

 ThreadPool.SetMaxThreads(25, 200); 
     State state; 
     Hashtable ht = new Hashtable(); 
     for (int i = 0; i < 100; i++) 
     { 
      state = new State(); 
      state.Input = "Pakistan"; 
      ThreadPool.QueueUserWorkItem(PerformUserWorkItem, state); 
      ht.Add(i, state); 
     } 
     State tempState; 
     for (int i = 0; i < 100; i++) 
     { 
      tempState = (State)ht[i]; 
      if (tempState.eventWaitHandle.WaitOne()) 
      { 
       Session["percentage"] = i; 
       lblPercentage.Text = (i * 1).ToString(); 
      } 
     } 
private static void PerformUserWorkItem(Object stateObject) 
    { 
     State state = stateObject as State; 
     if (state != null) 
     { 
      // do something lengthy with state.inputString     

      state.result = state.Input.Length; 
      state.eventWaitHandle.Set(); // signal we're done 
     } 
    } 

上記のコードでは、私は作業のためにスレッドをキューに入れ、ハッシュテーブルに初期状態を保存しました。 ページの進行状況バーを更新するタイマーがあり、カウントされたページ数と残りの数が表示されます。

私のページを別のページにリダイレクトする必要があります。この文脈ではレスポンスが利用できないというエラーが表示されます。 「私は、Server.Transferのを使用しようとしましたが、

としてエラーになって が、私は(これに私はリダイレクトしています)ターゲットページを無効にしているプロパティenabeviewstate = false「のエラーは、子要求の実行」が、それはまたのdidn私のために働いた。 この後、私のビジュアルスタジオはひっくり返り、このエラーが2回発生します "localhostはローカルWebサーバーに接続できません" エラー2回後にVisual Studioが正常に動作します。

更新
ここではそれをuユーザーEventWaitHandle becus誤りである私のタイマー宣言の

 System.Timers.Timer t = new System.Timers.Timer(3000); 
    t.Enabled = true; 
    t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed); 
    void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     lbl1.Text = DateTime.Now.ToString();   
    } 
+0

どのようなタイマーを使用しますか? – Hinek

+0

サイドノート:なぜハッシュテーブルですか? –

+0

この作業は1回のリクエストで実行しますか?要求内で長時間実行されるタスクを実行できますが、ajaxコントロールを使用していない限り、(lbl1などの)コントロールを更新することはできません。 WebFormsまたはMVCを使用していますか? –

答えて

0

です。 wait handleはメインスレッド(クライアントスレッド)をまだ生き残らせます。 Server.Transferを使用すると、メインスレッドが動作しており、サブスレッドと共同作業するため、ThreadAbourtExceptionが発生します。

iは、.NET 4.0

public void perform() 
{ 
Object[] works = ...; 
System.Threading.Tasks.Parallel.ForEach(works, each => { PerformUserWorkItem(each); }); 
Server.Transfer("progress.aspx"); 
} 

private static void PerformUserWorkItem(Object stateObject) 
    { 
     ... 
    } 

そしてprogress.aspxページでは、uが進捗状況を見るには呼び出すために 'SETTIMER()' と呼ばれるjavascript関数を使用することができますお勧めします。

さらに、System.Timers.Timerは、リモート環境を制御しないサーバー上で実行されるタイマーオブジェクトです。あなたがASPページをコールバックする場合は、クライアント呼び出しをトリガするためにASPページでタイマー制御が必要になります

関連する問題