우리는 C# WinForms 응용 프로그램이 매우 느리며 종종 CPU 시간을 50 % 소비합니다.WinForms 응용 프로그램 프로파일 링
DotTrace를 사용하여 가장 시간이 많이 걸리는 작업이 UI 스레드에 있음을 확인했습니다. 특히 System.Windows.Forms.DataGridView.WndProc (Message &)는 대부분의 시간을 소모합니다.
프로그램이 DataGridView 컨트롤에서 Invoke 또는 BeginInvoke를 호출한다는 것을 알고 있습니다. 이는 DataGridView 컨트롤에 메시지를 보내는 것과 같습니다. 그러나 호출 스레드가 해당 메시지를 보내는 데 소요되는 시간은 매우 작습니다. 대부분의 시간은 UI 스레드에서 해당 메시지를 처리하는 데 소요됩니다.
그래서 dotTrace는 UI 스레드에서 가장 시간이 많이 걸리는 작업을 파악할 수 있지만 해당 스레드를 보내는 스레드를 파악할 수 없습니다.
그렇다면이 스레드를 찾으려면 어떻게해야합니까?
"우리는 C# Winform 응용 프로그램이 매우 느리며 종종 CPU 시간이 50 %라고 가정합니다." - 정말 ? 정말 느린 경우 스파이크가 그보다 훨씬 높을 것으로 예상됩니다 ... UI 업데이트 폭풍이 발생 했습니까? 그건 UI 업데이트가 다른 업데이트와 캐스케이드를 유발한다는 의미입니다. –
@MitchWheat 예, Windows 작업 관리자를 사용하여 프로그램을 모니터링했습니다. CPU 사용은 항상 약 50 %입니다. 실제로이 프로그램은 거래 플랫폼입니다. 그것은 지속적으로 외부로부터 견적 정보, 주문 상태 정보 등을 받고, 일부 계산을 수행 한 다음 UI를 업데이트합니다. 우리는 매회 약 100 건의 주문을 발행 할 수 있도록 자동 거래 대행사를 작성하고 있습니다. 모든 수신 메시지를 신속하게 처리 할 수 없음을 발견했습니다. 그래서 병목 현상이 무엇인지 알아 내야합니다. UI 인 경우 UI 업데이트의 원인을 찾아야하며 업데이트 빈도가 느려질 수 있습니다. – rmm2014
DataGridVew에서 프로세스가 길거나 여러 번 트리거되는 이벤트가 있거나 셀 값 변경 또는 행 추가와 같이 끝없이 활성화되는 이벤트가있을 수 있습니다. – Jade