2010-12-07 13 views
1

J'ai une application web qui compte les mots d'un document. donc cela prend assez de temps.J'ai divisé cela en pages et méthode invoquée pour chaque page dans un fil différent. J'utilise threadpool commeasp.net Multithreading avec timer

 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 
     } 
    } 

Dans le code ci-dessus j'ai mis en attente pour les discussions de travail et sauvé leur état initial dans la table de hachage. J'ai timer qui met à jour la barre de progression sur la page que combien de pages de comptage est fait et combien reste.

J'ai besoin de rediriger ma page vers une autre page et j'obtiens l'erreur que Réponse n'est pas disponible dans ce contexte. J'ai essayé d'utiliser le Server.Transfer mais obtenir l'erreur comme

« erreur enfant exécution demande » alors j'ai désactivé la page cible (à laquelle je suis redirigez) propriété enabeviewstate = false mais aussi didn » t travaillé pour moi. après tout cela mon studio visuel se coincé et j'obtiens cette erreur deux fois "localhost ne peut pas se connecter au serveur web local" après l'erreur 2 fois mon studio visuel fonctionne très bien.

Mise à jour
Voici ma

de déclaration de minuterie
 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

Quel type de minuterie utilisez-vous? – Hinek

+0

Note de côté: Pourquoi une table de hachage? –

+0

Effectuez-vous ce travail dans une seule requête? Vous pouvez exécuter une tâche longue dans une requête, mais vous ne pouvez pas mettre à jour un contrôle (comme votre 'lbl1'), sauf si vous utilisez des contrôles ajax. Utilisez-vous WebForms ou MVC? –

Répondre

0

Il est u erreur Becus utilisateur EventWaitHandle. wait handle rend votre thread principal (thread client) encore vivant. et après avoir utilisé Server.Transfer, il aura ThreadAbourtException car le thread principal travaille et collabore avec subthread.

Je recommande .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) 
    { 
     ... 
    } 

Et dans la page progress.aspx, u pouvez utiliser la fonction javascript appelé 'SetTimer()' appeler pour obtenir des progrès. En outre, System.Timers.Timer est un objet timer qui s'exécute sur un serveur qui n'a aucun contrôle sur l'environnement distant. Si vous voulez que la page asp rappelle, vous aurez besoin du contrôle de la minuterie dans la page asp pour déclencher l'appel du client