2010-11-18 5 views
3

최근에 서비스를 작성한 후 단일 스레드를 사용하여 주기적으로 정보를 처리합니다. 이 서비스는 Microsoft Visual Studio 2010 Express를 사용하여 작성되었습니다. CPU 사용량이 달에 이륙 한 것을 보았습니다 (CPU 사용량 100 %).실행 중 CPU 사용량이 매우 높아졌습니다.

나중에 호기심에서 나는 아주 작은 프로그램을 만들었습니다. 아주 작은 프로그램을 만들었습니다. 그 프로그램은 작은 스레드 나 타이머를 시작한 다음 믿기지 않을 정도로 긴 루프를 실행합니다. 또한 콘솔 응용 프로그램을 Windows Form 응용 프로그램으로 변환했습니다. 빌드 할 프로그램 유형을 전환하여 문제를 줄일 수있었습니다.

System.Threading.Thread.CurrentThread.Priority = ThreadPriority.Lowest; 

나는 또한 CPU 사용량이 있었어요 수 있다고 생각

Process p = Process.GetCurrentProcess(); 
p.PriorityClass = ProcessPriorityClass.BelowNormal; 

나는 또한 우선 순위 클래스를 설정하려고했습니다

나는 스레드의 우선 순위를 낮추는 시도했습니다 가상 컴퓨터에서 실행되기 때문에 높습니다. 그러나 그 이론은 나를 데려 가지 않았다. 꽤 우습다. 나는 어디에서 다른 방향으로 나아갈 지 모른다. 타이머 나 스레드를 시작하는 것이 .NET Framework에서하는 것처럼 천장을 통해 CPU 사용량을 보내는 이유가 확실하지 않습니다. COM 객체를 만들 때 나는 이것을 경험하지 못했습니다. 누구든지 내가 돌아갈 수있는 것에 관해서 어떤 밝은 생각을 가지고 있습니까?

미리 감사드립니다.

답변

2

스레드에서 반복적으로 반복 작업을하는 경우 CPU 사용량이 높아질 수 있습니다. 루프 사이의 스레드 실행에 일시 중지를 추가 했습니까?

Thread.Sleep(1000); 
+0

Thread.Sleep (1000)은 모든 것을 이해하는 데 도움이되었습니다. 실제 프로그램은 다소 복잡합니다. 이것은 내가 작성한 아주 작은 프로그램의 일부입니다. System.Threading.Thread th = new System.Threading.Thread (새 ThreadStart (ThreadFunc))); th.Priority = ThreadPriority.Lowest; th.Start(); public static void ThreadFunc() { System.Threading.Thread.Sleep (10000); 또는 (long i = 0; i <1000000000; i ++) {} System.Threading.Thread.Sleep (10000); } –

+0

원래 프로그램의 의도는 정보를 처리하는 것이지만, 자주 실행해야합니다 (예 : 1/2 시간 또는 1 시간). 나는 Windows Scheduler가 단지 매일 작업을 빈번하게 스케쥴 할 수있게한다는 것을 알고있다. 스케쥴을 추적하기 위해 스레드를 사용할 것이라고 생각했지만, 나는 그것이 영리하다는 것을 알지 못한다는 것을 느끼기 시작했습니다. 그래서 나는 제안을 기다리고 있습니다. –

+0

난 내 자신의 일을하려고 대신 스레드 및 타이머를 사용하여 내 프로그램을 가볍게 유지하려고 노력 대신 Windows 작업 스케줄러를 돌아서 사용할 수 있습니다. 고마워요. –

3

코드와 같은 소리가 예기치 않게 반복적으로 반복됩니다.

Visual Studio 디버거에서 시작하고 높은 CPU가 표시되면 '중단'을 눌러 실행을 일시 중지하십시오. 콜 스택 (callstack) 및 반복적으로 반복 할 때 나타나는 프로그램 상태는 논리에 무엇이 잘못되었는지를 알려줍니다.

디버거에서 코드를 단계별로 실행하는 것이 더 빠를 수도 있습니다. 그것은 코드의 복잡성에 달려 있습니다.

관련 문제