2014-03-25 3 views
0

양식을 만들고 표시 할 때 양식이 열려있을 때 응용 프로그램을 닫으면 (종료) 스택 오버플로 예외가 발생합니다.열린 양식으로 응용 프로그램을 닫을 때 스택 오버플로가 발생했습니다.

private static void OpenSettings(Object sender, EventArgs e) 
{ 
    ActionLog.Write("Opened Settings"); 
    form_Settings f_Settings = new form_Settings(); 
    f_Settings.Show(); 
} 

컨텍스트 메뉴 콜을 사용하여 내 응용 프로그램 닫기 :

private static void Quit(Object sender, EventArgs e) 
{ 
    ActionLog.Write("Exit"); 
    Settings.Serialize(); 
    Environment.Exit(0); 
} 

예외가 GUI.form_Settings.Dispose 함수 슬로우

형태 표시. 이 함수는 절대 종료되지 않고 무한 재귀를 발생시킵니다.

응용 프로그램을 닫을 때 창이 열리지 않으면 모든 것이 잘됩니다.

어때?

// 편집 : 꽤 표준입니다

protected override void Dispose(bool disposing) 
{ 
    if (disposing && (components != null)) 
    { 
     components.Dispose(); 
    } 
    base.Dispose(disposing); 
} 

맞춰, 나는 어떤 다른 정의를 찾을 수 없습니다. 또한이 동작에 대한 이유가 될 수있는 사용자 지정 프레임 워크 (https://github.com/viperneo/winforms-modernui)를 사용하고 있음을 말씀 드리고 싶습니다.

+5

예외가'Dispose()'메소드에서 발생하면, 아마도 그 메소드를 게시해야합니까? 주어진 코드는 문제와 관련이 없습니다. – TypeIA

+0

Show() 호출 후 f_settings.Close()에 대한 호출을 추가하면 어떻게됩니까? 또한 OpenSettings를 처음 실행하면됩니까? –

+0

'종료'는 어디에서 호출됩니까? –

답변

0

방금 ​​사용자 지정 프레임 워크 (https://github.com/viperneo/winforms-modernui)가 의도 한대로 작동하지 않는다는 것을 알았습니다. 모든 것이 정상적인 Windows Forms에서도 잘 작동하지만 예외는 발생하지 않습니다. 그러나 프레임 워크를 사용할 때 어떤 이유로 응용 프로그램이 종료되기 전에 양식이 삭제되지 않으면 예외가 발생합니다. 바라건대 누군가이 프레임 워크를 사용할 때 이것을 읽을 수 있습니다.

사용자 정의 프레임 워크와 관련하여 Hans Passant에게 감사드립니다!

1

아마 재귀 호출의 피해자입니다. 예외가 throw 될 때 스택 추적을보고 반복적으로 호출되는 메서드를 볼 수 있습니다. 아마도 Quit의 작업 중 하나가 Quit을 다시 호출하는 이벤트를 트리거하고 있습니다.

위키 백과의 Recursion을 참조하십시오. 내가 개체가 배치되었는지 여부를 말하는 플래그를 추가

(귀하의 코멘트에 응답) UPDATE


.

private bool _disposed = false; 

protected override void Dispose(bool disposing) 
{ 
    if (!_disposed) { 
     _disposed = true; 

     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
      components = null; // Now they cannot be disposed again. 
     } 

     base.Dispose(disposing); 
    } 
} 

하지만 왜 재귀 적으로 호출되는지 이해하려고합니다. 다른 곳에 숨겨진 다른 버그가있을 수 있습니다.

+0

이미 그렇게했지만,이 특정 기능 만 계속 반복되었습니다. 다른 함수는 기록되지 않았습니다. 적어도 스택 추적 창은 더 많은 항목을 표시하지 않습니다. – 0x8BADF00D

+0

이것은 정확하게 재귀 적으로 호출되는 함수입니다. "이 함수"는 아마'종료'를 의미합니다. 어떻게, 어디서, 언제 종료 될까요? –

+0

아니요, 스택 추적에는'Test.exe! Test.form_Settings.Dispose (bool disposing) Line 21 C#'과 같이이 행의 항목 만 포함되어 있습니다. 다른 건 없어. 종료는 컨텍스트 메뉴 콜백입니다 (사용자가 메뉴 항목을 클릭하는 경우). 컨텍스트 메뉴는 응용 프로그램의 시작 부분에있는'NotifyIcon'에 첨부됩니다. – 0x8BADF00D

관련 문제