2010-12-07 62 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页面中进行定时器控制来触发客户端调用