2010-08-24 21 views
3

Une de mes applications empêche l'arrêt de Windows s'il est en cours d'exécution.Pourquoi une application .NET empêche-t-elle l'arrêt de Windows?

Le seul endroit où je soupçonne que la cause peut être est FormClosing gestionnaire d'événements, ce qui est cependant tout à fait standard:

EDIT: La suppression de ce gestionnaire ne change pas la situation du tout si la cause est ailleurs.

private void MainForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason != CloseReason.UserClosing) 
    { 
     StopAllThreads(); 
     //let close 
     return; 
    } 
    //ask user whether he wants to save his work 
} 

Je n'ai pas été en mesure de reproduire cela avec la plus simple application possible ne contenant que ce gestionnaire de FormClosing - la simple application est fermée correctement lorsque Windows démarre la fermeture. Quoi d'autre peut empêcher les fenêtres de s'éteindre?

Où dois-je regarder dans le code pour déboguer ce problème?

Je n'ai aucune implémentation WndProc personnalisée dans mon formulaire principal. Ceci est une application .NET 2.0. Lorsque j'exécute l'application dans le débogueur et initie l'arrêt, je reçois seulement "Ce programme empêche Windows de s'arrêter" (Windows 7) pendant un moment. Windows arrête alors Visual Studio qui arrête le débogueur qui arrête l'application en cours de débogage.


EDIT: méthode StopAllThreads

public static void StopAllThreads() 
{ 
    lock (syncLock) 
    { 
     foreach (IStop stoppable in stoppables) 
     { 
      try 
      { 
       stoppable.Stop(); //stops a running thread by setting a volatile boolean flag 
      } 
      catch (Exception ex) 
      { 
       Debug.Fail("Error stopping a stoppable instance: " + ex.ToString()); 
      } 
     } 
     stoppables.Clear(); 
     disposed = true; 
    } 
} 

S'il vous plaît noter: L'application peut être fermé normalement lorsque l'utilisateur ferme manuellement.

+0

Qu'est-ce que le code de 'StopAllThreads' ressembler? –

+0

Je vois que vous utilisez le filetage (ou du moins, je suppose que vous êtes); pourriez-vous avoir des discussions de fond qui ne sont pas fermées? –

+0

Que se passe-t-il lorsque vous supprimez cette fonction? –

Répondre

3

Problème résolu: L'une des formes de l'enfant a été OnClosing impérieuses, avec le code suivant:

protected override void OnClosing(CancelEventArgs e) 
    { 
     e.Cancel = true; 
     this.Hide(); 
    } 
+0

Et pour résoudre ce problème, dans mon cas, j'ai ajouté la condition: si (e.CloseReason == CloseReason.UserClosing) e.Cancel = true; – kdmin

1

Avez-vous déjà parcouru ce code pour voir s'il est complètement exécuté ou s'il est bloqué quelque part? Il est possible que le verrou ne puisse pas recevoir syncLock pour une raison quelconque et attende.