문제

나는 내가 무엇을 사용해야하는지 알아 내려고 노력하고있다. 대화 상자 모드에서 양식의 winform 앱을 닫을 때. 이 양식은 DB를 원격 DB와 동기화하고 "Splash Form"에 진행되는 배경 작업자를 실행합니다.

나는 그런 방법이 있습니다.

private void CloseMyApp()
{
    SaveUserSettings();

    splashForm = new SplashForm();
    splashForm.ShowDialog();

    Application.ExitThread();
    //Application.Exit();
}

내가 앱을 닫기 위해 전화하는 것은 메뉴 -> 종료 그리고 Form_FormClosing() 이벤트. Application.Exit() 다음 오류를 제공합니다 ->

수집이 수정되었습니다. 열거 작업이 실행되지 않을 수 있습니다.

이제 나는 그것을 읽었습니다 Environment.Exit() 잔인하고 앱에 문제가있을 수 있음을 의미합니다 ( 여기).

Application.ExitThread() 작품이지만 나는 그것이 작동하는 것처럼 보일 수 있으며, 내가 그것을 사용하지 않았기 때문에 그것을 사용하지 않았기 때문에 일반적으로 그렇게하는 것이 확실하지 않기 전에 그것을 사용한 적이 없다.

도움이 되었습니까?

해결책

불행히도, 문제는 이러한 모든 시나리오에서 이러한 모든 시나리오 에서이 문제에 의해 발생하지 않으며 (메시지를받지 않더라도) 실제로 존재합니다.

당신의 문제는 이것입니다 :

대화 상자 모드에서 양식의 winform 앱을 닫을 때. 이 양식은 DB를 원격 DB와 동기화하고 "Splash Form"에 진행되는 배경 작업자를 실행합니다.

종료를 요청할 때 실제로 종료되지 않기 때문에 모든 "종료"기능은 배경 스레드를 찢어 내려고합니다. 불행히도, 이것은 아마도 DB 동기화의 중간에 발생하고 있으며, 저장 로직에서 작동하는 열거는 아마도 그 오류를 제공 할 것입니다.

이 중 어느 것도 사용하지 않는 것이 좋습니다. myMainForm.Close() 대신에. 그것은 당신의 기본 양식을 닫아서 마감 논리를 적절하게 발사 할 것입니다. 응용 프로그램의 기본 양식이 닫히면 우아하게 종료됩니다.

다른 팁

Environment.Exit() 콘솔 앱에 사용됩니다.

사용하고 싶습니다 : System.Windows.Forms.Application.Exit()

스레드를 종료하면 현재 스레드 컨텍스트 만 종료하면서 시작된 전경 스레드를 실행합니다. 오류를 일으키는 스레드가 여전히 실행중인 것으로 생각되므로 문제를 마스킹하면서 문제가 발생하지 않았습니다. 나는 당신이 왜이 오류를 받고 있는지 알아 내려고 노력할 것입니다 "Collection was modified; enumeration operation may not execute." 출구에. 노출되고 있습니다 Application.Exit(), 그러나 그것은 그것에 의한 것이 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top