2010-01-18 2 views
3

아래 코드는 내 슬픔의 예입니다. 그것은 프로그램이 충돌하게하는 간단한 OpenFileDialog() 호출입니다. XP에서는 대화 상자가 몇 초 동안 열려있을 때 충돌이 발생합니다. Vista에서는 사용자가 "내 컴퓨터"를 선택하면 충돌이 발생합니다. VS2008에서 디버거가 때때로 stackoverflow 예외를 포착합니다. 첫 번째 줄 (new ...)에 중단 점을 넣으면 vshost.exe가 충돌합니다. ShowDialog() 줄에 중단 점을 넣으면 FatalExecutionEngineError가 발생합니다. vshost없이 컴파일하면 응용 프로그램이 임의의 충돌 (XP 에서처럼 시간이 약간 남을 때)까지 실행됩니다.C# OpenFileDialog의 Stackoverflow/CLR 오류

다른 유형의 파일을 여는 두 개의 열린 대화 상자가 있으며, 세 가지 모두 동일한 동작을합니다. 비슷한 코드가 내 다른 프로젝트에서 같은 동작을 보이지 않습니다.

스레드 아파트는 싱글입니다. ValidateNames = false 설정을 시도했습니다. 디버거는 대부분의 경우 최단 거리에서 벗어납니다.

OpenFileDialog imageDlg = new OpenFileDialog(); 
imageDlg.Filter = "All Images|*.jpg;*.jpeg;*.png;*.tif;*.tiff;*.bmp|All Files|*.*|JPEGs (*.jpg)|*.jpg|PNGs (*.png)|*.png|TIFFs (*.tiff)|*.tiff|TIFFs (*.tif)|*.tif|BMPS (*.bmp)|*.bmp"; 
imageDlg.Title = "Select Scan Image"; 

if (DialogResult.OK == imageDlg.ShowDialog()) 
{ 
    updateImageDisplay(); 
} 

이벤트 핸들러 코드 :

// 
// setScratchImageButton 
// 
this.setScratchImageButton.Location = new System.Drawing.Point(191, 15); 
this.setScratchImageButton.Name = "setScratchImageButton"; 
this.setScratchImageButton.Size = new System.Drawing.Size(26, 23); 
this.setScratchImageButton.TabIndex = 8; 
this.setScratchImageButton.Text = "..."; 
this.setScratchImageButton.UseVisualStyleBackColor = true; 
this.setScratchImageButton.Click += new System.EventHandler(this.setScratchImageButton_Click); 

코드는이 대화 상자를 표시하는 방법은 어떤 상황에서 호출되고에서

private void updateImageDisplay() 
    { 
     if (null != project.srcImage) 
     { 
      imageDisplay.SizeMode = PictureBoxSizeMode.Normal; 
      if (project.srcImage != null) 
      { 
       imageDisplay.ClientSize = new Size(project.srcImage.Width, project.srcImage.Height); 
       imageDisplay.Image = (Image)project.srcImage; 
      } 
      this.ScratchImage.Text = project.srcImageLocation; 
     } 
     else 
     { 
      imageDisplay.Image = null; 
      this.ScratchImage.Text = ""; 
     } 
     ImageDisplayPanel.Refresh(); 
    } 

답변

5

라고? 이 오류의 가장 큰 원인은 이벤트가 여러 번 생성되어 OpenFileDialog의 많은 인스턴스가 사용자에게 표시된다는 것입니다. 잠재적으로 서로의 위에 표시되어 하나의 대화 상자 만 나타납니다.

편집

은 디버거의 속성 창 (도구 -> 옵션 -> 디버거)로 암시 적 기능 평가를 끈 다음 시도 실패 만 디버거 시나리오의 경우. 폼의 속성 중 하나가 디버거를 통해 볼 때 스택 오버플로를 일으킬 수 있습니다.

+1

+1 - 컨텍스트가 필요합니다. StackoverflowException은 종종 메서드가 너무 많이 호출되는 것을 의미합니다. – keyboardP

+0

폼 디자이너가 생성 한 코드에서 함수가 호출되고 있습니다. 코드는 단일 버튼 클릭으로 인스턴스화됩니다. 이 코드는 코드베이스에 한 번만 이벤트로 추가되었음을 확인했습니다. 함수 이름은 코드에서 두 번 (한 번은 디자이너 코드에서, 한 번은 함수 정의에서) 코드 이름에 정확히 두 번 존재합니다. 파일 저장 대화 상자에서도 동일한 문제가 발생한다고 판단했습니다. 충돌 이전에 20 초 동안 대화 상자가 열려 있습니다. 대화 상자의 인스턴스가 하나만 열려 있는지 확인했습니다. – user253431

+0

@unknown, 이벤트 연결 코드와 updateImageDisplay 코드를 게시 할 수 있습니까? – JaredPar

1

프로젝트에 추가 한 DLL에서 힙 손상이 발생했습니다. 증상은 이상하고 아름다운 사고였습니다.