2011-08-02 4 views
1

Dans des circonstances normales, il ne devrait pas être possible d'accéder aux valeurs de propriétés affectées au thread principal sur la fonction TimerCallback, n'est-ce pas?Confusion à propos de System.Timers.Timer

j'ai une classe qui utilise une minuterie et cette classe a une méthode pour TimerCallback, eh bien, j'accéder aux propriétés de cette méthode comme s'il n'y avait pas multithread (je vois les valeurs attribuées à thread principal)

Si nécessaire je vais coller du code, mais je voulais d'abord savoir si j'ai une confusion majeure par rapport à Timers.

Merci

+0

Propriétés sur quoi? Un formulaire WinForms? – Cameron

+0

Non, désolé, c'est une classe affaires sur un service Windows – StackOverflower

Répondre

2

il should't possible d'accéder aux valeurs des propriétés attribuées à thread principal sur la fonction TimerCallback, non?

Mauvais! Ce n'est que lorsque vous utilisez UI qui s'appuient sur le thread principal, exemple lors de l'utilisation winforms UI et WPF et même certains composants COM vous devez seulement accéder à ses membres du thread qu'ils ont créé sur, peu importe si le fil principal ou pas.

Cependant, pour une classe personnalisée que vous créez, peu importe le thread qui accède au membre, tout thread peut accéder à la classe et à ses membres, quel que soit le thread qui crée cette classe ou non .

2

Vous n'êtes pas censé accéder aux objets de l'interface utilisateur sauf à partir du thread qui les a créés (généralement le thread principal). Si vous le faites, il peut fonctionner, mais vous courez le risque d'avoir une exception levée, ou pire, des choses se cassant silencieusement.

D'autres objets peuvent être accédés par n'importe quel sujet à n'importe quel moment sans qu'aucune exception ne soit levée; Cependant, vous devez toujours faire attention à éviter les situations de concurrence. Par exemple, si vous avez ce code pour créer un singleton:

class Unique { 
    private static Unique instance; 

    public static Unique Instance { 
     get { 
      if (instance == null) { 
       instance = new Unique(); 
      } 

      return instance; 
     } 
    } 
} 

Ensuite, si deux threads accèdent à la propriété Instance en même temps, ils pourraient à la fois fin jusqu'à la création d'une nouvelle instance du singleton (car ils les deux peuvent entrer le if en parallèle).

L'une des façons les plus simples pour éviter ces scénarios est avec verrouillage:

lock (AnyObject) { 
    // Any other code locking on the same object cannot run while this code runs 
} 
+0

* Oh, mes yeux! * Je ne suis pas à aimer le modèle singleton, même si elle a été expliquée en détail à http://csharpindepth.com/Articles /General/Singleton.aspx :-) – Patrick

+0

@Patrick:: PI l'utilisait simplement comme un exemple simple des problèmes que vous pouvez rencontrer avec les threads – Cameron

2

De la documentation System.Timers.Timer:

Si vous utilisez la minuterie avec un élément d'interface utilisateur, par exemple une forme ou contrôle, sans placer le temporisateur sur cet élément d'interface utilisateur, affectez le formulaire ou le contrôle qui contient le temporisateur à la propriété SynchronizingObject, afin que l'événement soit marshalé au thread d'interface utilisateur.

Questions connexes