2011-08-10 1 views
0

J'ai une application de vérification de compteur, qui surveille PerformanceCounters [PC] à partir de .Net.PerformanceCounters: comportement incorrect non identifié

J'utilise un wrapper de classe pour le PC pour permettre l'accès synchronisé etc. Le CounterWrapper a une méthode Init, où le code suivant est exécuté:

PerformanceCounterCategory pcc = new PerformanceCounterCategory(this.categoryName, this.machineName); 
if(pcc.CounterExists(this.counterName)) 
{ 
    if(this.pc != null) //Could exist from earlier use. 
    { 
     try 
     { 
      this.pc.Close(); 
      this.pc.Dispose(); 
     } 
     catch(Exception ex) 
     { 
      ...log 
     } 
    } 

    this.pc = new PerformanceCounter(this.categoryName, this.counterName, this.instanceName, this.machineName); 
    float value = pc.NextValue();  //Initial read//////-----MARK-----. 
} 

Ce code fonctionne bien initial.

Après l'un des ordinateurs regardé va en ligne - c'est inscrit dans la méthode de mise à jour - le code ci-dessus ne fonctionne plus et pour tester la disponibilité à distance de ce compteur, le méthode ci-dessus « Init » est appelé à nouveau. Parfois, cela fonctionne, parfois cela échoue. Si elle échoue, je vois:

InvalidOperation; Message: Impossible d'accéder à une clé de registre fermée. Nom de l'objet: 'HKEY_PERFORMANCE_DATA'., Source: mscorlib

Ceci est à la position MARKed dans le code ci-dessus.

J'attendais le code à l'échec ici:

PerformanceCounterCategory pcc = new PerformanceCounterCategory(this.categoryName, this.machineName); 
if(pcc.CounterExists(this.counterName)) 

ou ici:

this.pc = new PerformanceCounter(this.categoryName, this.counterName, this.instanceName, this.machineName); 

Mais pas dans "Init" à "value = this.pc.NetxtValue" [Marked pos ]

Il semble y avoir quelque chose d'étrange dans le framework [et ce n'est pas la première fois, je vois quelque chose d'étrange avec ça à PerformanceCounters].

Toute aide serait géniale!

Merci à ce jour et meilleures salutations,

++ MABRA

Répondre

0

Vous fermez et disposer le membre du PC, mais vous ne définissez pas à null, et c'est ce que vous tester contre la prochaine fois vous appelez, donc vous appelez probablement Close sur une instance déjà fermée.

+0

Oh, mes propres pieds, je vois :-(Merci beaucoup! – mabra

+0

Ne peut pas être, il obtient new-ed une ligne au-dessus. –

+0

pcc fait, mais pas pc, pour autant que Je peux dire. –

Questions connexes