2009-09-21 6 views
5

여기서 뭔가 잘못하고있을 것입니다. 다음과 같이 사용자 지정 성능 카운터를 만듭니다.성능 카운터가 변경되지 않는 이유는 무엇입니까?

string counterCategory = "Test Category"; 
string counterName = "Test Counter"; 

if (!PerformanceCounterCategory.Exists(counterCategory)) 
{ 
    Console.WriteLine("Creating Counters"); 

    CounterCreationDataCollection counterCreationDataCollection = 
     new CounterCreationDataCollection(); 

    counterCreationDataCollection.Add(
     new CounterCreationData(counterName, 
     "Description", 
     PerformanceCounterType.NumberOfItems32) 
    ); 

    PerformanceCounterCategory.Create(counterCategory, 
     "My category description/Help", 
     PerformanceCounterCategoryType.SingleInstance, 
     counterCreationDataCollection); 
} 

성능 카운터에서 카운터 범주와 카운터를 만들고 볼 수 있습니다.

내가 그때 앉아

PerformanceCounter myCounter = 
    new PerformanceCounter(counterCategory, counterName, false); 

for (int i = 0; i < 10; i++) 
{ 
    Console.WriteLine("Setting to "+i); 
    myCounter.RawValue = i; 
    Thread.Sleep(200); 
} 

myCounter.Close(); 

그러나 카운터의 값을 변경하려고 및 성능 모니터 아무것도에서 카운터를 보는 일이, 값은 변경되지 않습니다.

그래서 내가 뭘 잘못하고 있니?

nextValue() 또는 rawValue()에 대한 호출을 추가하면 예상대로 그 값이 반환되지만 Windows 성능 모니터에는 여전히 평행선이 표시됩니다.

for (int i = 0; i < 10; i++) 
{ 
    Console.WriteLine("Setting to "+i); 
    myCounter.IncrementValue() 
    Console.WriteLine("Next Value = "+myCounter.RawValue()); 
    Thread.Sleep(200); 
} 

편집 : 내가 성능 모니터를 닫고, 카운터를 삭제하지 않고 다시 열 경우 그 갑자기 새로운 값이의 실현 것으로 나타났습니다. 따라서 값이 설정되고 지속되지만 성능 모니터에서는 변경 내용을 볼 수 없습니다.

답변

2

후속 조치가 필요합니다. 어쨌든 Win7에서는 성능 모니터가 예상대로 작동하지 않을 수도 있습니다. 테스트 코드를 작성할 때 성능 모니터를 시작하기 위해 카운터를 만든 후 응용 프로그램을 일시 중지했습니다. 일단 내가 모니터를 계속 변경시키지 않으면, 기본 카운터가 변경 되더라도 카운터가 변경되지 않습니다.

성능 모니터를 종료하고 다시 시작하면 테스트 프로그램의 마지막 카운터 값이 표시되어 제대로 설정되었음을 나타냅니다. 그런 다음 테스트 프로그램을 다시 실행하고 값을 변경하면 성능 모니터가 결국 변경 사항을 적용합니다.

코드에 표시된대로 모두 코드가 올바르지 만 오작동하는 Windows 성능 모니터였습니다.

답장을 보내 주셔서 감사합니다.

+0

제 경우에는 재부팅하십시오. –

0

코드가 좋아 보인다. 내 작업 예제에서 유일한 차이점은 RawValue를 설정 한 후에 increment 메서드를 호출한다는 것입니다.

PerformanceCounter myCounter = 
    new PerformanceCounter(counterCategory, counterName, false); 

for (int i = 0; i < 10; i++) 
{ 
    Console.WriteLine("Setting to "+i); 
    myCounter.Increment(); 
    Thread.Sleep(200); 
} 

myCounter.Close(); 
+0

아니요, 여전히 평평한 선인 저는 Increment()와 RawValue를 설정하는 것이 좋습니다. – blowdart

+0

웃긴다. 점심 시간에 그걸 들여다 볼 것입니다. – Dejan

1

카운터 과정에서 카운터 이름을 변경 했습니까? 코드가 카테고리에 카운터가 있는지를 확인하지는 않습니다. 카테고리가 있는지 만 확인하고 카테고리가 존재하는 경우 카테고리를 생성하지 않습니다.

범주를 처음 만든 후 카운터 이름을 변경 한 경우 새 카운터가 범주에 없으므로 성능 모니터에서 카운터를 볼 때 카운터 이름에 약간의 차이가 누락 될 수 있습니다.

+0

좋은 생각인데, 실행하기 전에 범주를 삭제하므로 다시 만들어지며 범주 이름과 카운터 이름은 모두 카운터 생성 및 열기에 사용되는 문자열에 보관됩니다. – blowdart

+1

이 프로젝트의 큰 부분입니까? 질문에서 귀하의 코드를 가져 와서 콘솔 프로젝트의'static void Main (string [] args)'메소드로 감쌀 때 수정없이 작동했습니다.필자는 성능 모니터에서 찾을 수 있도록 범주를 만들기 위해 두 번 실행해야했습니다. 그런 다음 두 번째로 값이 변경되는 것을 확인했습니다. – GBegen

+0

이것은 콘솔 앱에 있었고 재미있는 웹 페이지에서는 원시 값을 설정했습니다. 성능 모니터를 닫고 다시 열어서 갑자기 변경 사항을 보았습니다. 카운터를 만든 직후 모니터링을 좋아하지 않을 수도 있습니다. – blowdart

관련 문제