2010-04-24 15 views
2

Jusqu'à présent, j'ai ce code exécuté lorsque le bouton X est cliqué, mais je ne suis pas sûr si c'est la bonne façon de terminer les threads sur un formulaire à la sortie.C# Abort() des threads en sortie pour un formulaire

  Type t = this.GetType(); 
      foreach (PropertyInfo pi in t.GetProperties()) 
      { 
       if (pi.GetType() == typeof(Thread)) 
       { 
        MethodInfo mi = pi.GetType().GetMethod("Abort"); 
        mi.Invoke(null, new object[] {}); 
       } 
      } 

Je continue à obtenir cette erreur. « Une tentative a été faite pour libérer un RCW qui est en cours d'utilisation Le BRF est en cours d'utilisation sur le fil actif ou un autre thread qui tente de libérer un RCW en cours d'utilisation peut. causer la corruption ou la perte de données. "

Répondre

3

Il est clair que ce n'est pas la bonne façon d'annuler ce thread particulier, l'exception vous le dit. Le message montre que vous utilisez un objet COM sur ce thread. Peut-être quelque chose comme Microsoft Excel? L'exécution d'objets COM sur un thread de travail est un problème, ils ont très souvent des exigences de thread strictes. L'un d'entre eux est qu'ils ne sont pas thread-safe et ont une affinité "threading appartement". Un mot cher pour "tous vos appels de méthode sur l'objet s'exécutera sur le thread de l'interface utilisateur de toute façon". Ce qui le rend plus lent, vaincre les avantages du filetage complètement.

Anyhoo, n'utilisez pas Reflection pour retrouver vos fils, utilisez directement le champ Thread de votre classe. Et assurez-vous de fermer le fil d'une manière contrôlée plutôt que de tirer sur le tapis. This thread montre un exemple.

+0

Je me suis toujours demandé pourquoi c'était toujours plus rapide lorsque la fenêtre était réduite. L'objet COM est un jeu flash et chaque fois que je lance une boucle infinie sur le thread de l'interface graphique, le jeu se fige, donc j'ai couru les boucles sur des threads séparés. –