2013-07-29 8 views
1

타사 컨트롤 (ComponentOne)을 사용하고 있으며 간헐적으로이 일반적인 이미지와 같은 일반적인 빨간색 X 상자가 나타납니다. 처음에는 GDI 누출이 있다고 생각했기 때문에 다리 작업을 한 후에 컨트롤을 그릴 때 내 GDI 번호가 유효하다는 것을 확인했습니다. Winform에 빨간색 X 예외가 있습니다.

enter image description here

주변에 인터넷 검색 후 나는 이런 종류의 오류는 늘 그것을 잡을, 렌더링하는 컨트롤을 호출 할 때 내가 시도 및 캐치를 넣어 경우에도 그러므로의 OnPaint() 이벤트에서 발생하고 있음을 발견했다.

그럼 내 다음 단계는 내 코드에있는 것입니다.

 protected override void OnPaint(PaintEventArgs e) 
     { 
      try 
      { 
       base.OnPaint(e); 
      } 
      catch (Exception ex) 
      { 
       this.Invalidate(); //attempt to redraw the control 
       XmSam.Log(ex); 
      } 
     } 

는 그 트릭을 할해야한다고 생각하지만, 나는이 문제에 모든 시간을 다시 만들 수 없으며, 그래서 나는 아직 완전히 위의 코드를 테스트 할 수 없었다. 내 질문에, 내 컨트롤을 렌더링하고 예외가있는 경우이 코드는 컨트롤을 다시 그리기 시도합니다. 이것이 무한 루프에 걸려 내 UI가 정지됩니까? 또는 예외를 일으키는 원인이 무엇이든간에 두 번째 컨트롤을 다시 그리면 괜찮을 것이라고 생각하나요?

+1

'Invalidate()'는 메시지 대기열에 다시 그리기 요청을 게시하기 때문에 (대략적으로) 동 기적으로 다시 그리지 않기 때문에 UI를 고정시키지 않습니다. 그러나 말했듯이 두 번째 및 후속 다시 그리기에 예외가 발생할 수 있습니다. 나는 그 예외가 무엇이고 무엇이 그것을 일으키는 지 조사 할 것을 제안합니다. –

+0

공식 지원 포럼에서 컨트롤을 발견 한 곳을 더 잘 묻는 것이 좋습니다. – RoadieRich

+1

뭔가가 HeaderCell.Paint 이벤트에서 null입니다. 우리는 그것을 볼 수 없다. – LarsTech

답변

0

과거에 이것을 보았을 때 항상 스레딩 문제와 관련이있었습니다. UI 스레드와 다른 스레드에서이 컨트롤을 업데이트하고 있습니까?

내가 처리 한 이래로 얼마 지나지 만 가장 쉬운 방법은 BackGroundWorker 클래스를 사용하여 백그라운드 작업을 수행하고 양식 컨트롤을 업데이트하는 것입니다.

4

BackGroundWorker Class

나는, 당신이 훨씬 더 만들어 그 트릭

없음을한다고 생각합니다. 이제 OnPaint() 메서드가 반복적으로 실행되어 동일한 예외가 반복적으로 발생합니다. 프로그램의 코어가 100 % 연소되는 것을 볼 수 있습니다.

OnPaint()에서 예외를 가져 오는 것은 실제로 생존 할 수있는 것이 아닙니다. 사용자를 살펴볼 필요가 없습니다. 지원 전화가 보장됩니다. 문제를 숨기는 대신 예외를 사용하여 실제로 무엇이 잘못되었는지 파악하고 수정 문제를 해결합니다. Debug + Exceptions를 사용하여 CLR 예외에 대해 Thrown 확인란을 선택하면 예외가 발생했을 때 디버거가 중지됩니다. 경우에 따라 프레임 워크 코드에서 예외가 발생하는 것은 거의 없으며 도구 + 옵션을 사용하고 디버깅을하고 "내 코드 만 사용"옵션을 해제하십시오.

관련 문제