2010-12-07 61 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 =假,但它也沒」 t爲我工作。 畢竟這我的視覺工作室得到stucked,我得到這個錯誤兩次 「本地主機無法連接到本地網絡服務器」 錯誤2次我的視覺工作室工作正常。

更新
這裏是我的定時器聲明的

 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 2010-12-07 09:48:15

回答

0

這是錯誤becus -u用戶的EventWaitHandle。等待句柄使您的主線程(客戶端線程)仍然活着。在使用Server.Transfer之後,它將有ThreadAbourtException,因爲主線程正在工作並與子線程協作。

我建議.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頁面中進行定時器控制來觸發客戶端調用