2009-09-23 8 views
3

Pourquoi mon Thread.Interrupt ne fonctionne pas?Thread.Interrupt ne fonctionne pas

Le code faisant l'interruption:

public void Stop() 
{ 
    const string LOG_SOURCE = "ProcessingDriver"; 

    if (_Enabled) 
    { 
     try 
     { 
      RequestProcessor.Disable(); 
      if (ProcessingThread != null) 
      { 
       ProcessingThread.Interrupt(); 
       ProcessingThread.Join(); 
      } 
     } 
     catch (Exception ex) 
     { 
      WriteLog(LOG_SOURCE, ex); 
     } 
    } 
} 

Le code que je pense à arrêter:

private void ProcessRequests() 
{ 
    const string LOG_SOURCE = "ProcessRequests"; 
    try 
    { 
     ProcessingThread = Thread.CurrentThread; 
     while (!_Disposed) 
     { 
      _ProcessingWaitHandle.WaitOne(); 
      int count = GetRequestCount(); 
      while (count > 0) 
      { 
       try 
       { 
        ExportRequest er = GetRequest(); 
        ProcessRequest(er); 
       } 
       catch (ThreadInterruptedException) 
       { 
        throw; 
       } 
       catch (Exception ex) 
       { 
        WriteLog(LOG_SOURCE, 
         ex); 
        WriteLog(LOG_SOURCE, 
         "Request Failed."); 
       } 
       //Suspend to catch interupt 
       Thread.Sleep(1); 
       count = GetRequestCount(); 
      } 
     } 
    } 
    catch (ThreadInterruptedException) 
    { 
     WriteLog(LOG_SOURCE, 
      "Interupted. Exiting.", LogType.Info); 
    } 
    catch (Exception critEx) 
    { 
     //Should never get here 
     WriteLog(LOG_SOURCE, critEx); 
     WriteLog(LOG_SOURCE, 
      "Serious unhandled error. Please restart.", LogType.Critical); 
    } 
} 

J'étagé dans le code. Je peux voir Interruption étant appelée (Veille ou attendre ne sont pas les commandes actives à ce moment), et je peux voir le sommeil être appelé, mais aucune erreur d'interruption n'est jamais levée (ni sur le sommeil, ni sur le WaitOne, même quand le fil blocs sur WaitOne).

Qu'est-ce que je fais mal?

Note: .Net 2.0

+0

+1 pour la clarté et la divulgation. –

Répondre

3

Hmmm ... il ne semble que cela devrait fonctionner, mais je vous conseille de ne pas utiliser Interrupt en premier lieu. Utilisez les événements et/ou Monitor.Wait/Pulse pour indiquer au thread que vous souhaitez arrêter. C'est une approche généralement plus simple, et qui donne au thread de travail plus de contrôle sur l'arrêt d'une manière ordonnée.

+0

J'aime la méthode Interruption car elle supprimerait automatiquement mon _ProcessingWaitHandle.WaitOne(); –

+2

Jon a raison. Voici pourquoi: http://www.bluebytesoftware.com/blog/PermaLink,guid,c3e634ac-4aa1-44eb-a744-02d6ed4de514.aspx –

+0

C. Ross: Le point d'un handle d'attente est que vous pouvez le définir sans juste interrompre le fil ... –