2009-11-13 7 views
0

저는 최근에 그들에게 제공되는 작고 비교적 간단한 C# 라이브러리를 사용해야하는 일부 학부생들을위한 약간의 교과 과정을 설정했습니다. 이 라이브러리의 주요 목적은 색칠 된 격자 (조작 할 수있는), 여러 개의 단추 및 텍스트가있는 레이블로 구성된 간단한 양식을 표시하는 것입니다.Windows Form 닫기 프로세스의 어느 시점에서 컨트롤이 무효화됩니까?

확장 클래스는 구현해야하는 여러 가지 추상 메소드 중 하나 인 UpdateAction을 호출하며 설정된 간격으로 자동 호출됩니다.

본인 스스로 실험실에서 폼을 닫을 때 일부 InvalidOperationException이 UpdateAction 메소드 내에서 발생했습니다. 오류 메시지는 일반적으로 다른 스레드에서 UI를 시도하고 수정할 때 표시 될 것으로 예상되는 오류이지만 일반적으로 문제가되는 컨트롤의 이름을 볼 수있는 큰 따옴표 '' 만 있습니다.
계속해서 문제가 계속되는 경우 우리는이 오류가 어떤 방식 으로든 작업 표시에 영향을주지는 않겠지 만 (라이브러리에 결함이있는 것으로 보이므로 이미 고정 버전 라이브러리를 다시 발행해야합니다. 암호).

내가 할 수있는 한, 학생들은 업데이트가 실행되고 수정되는 컨트롤이 업데이트 스레드가 중지되기 전에 폐기되도록 양식을 닫아야한다는 것을 알 수 있습니다. 즉, 컨트롤이 null로 표시됩니다. 이상한 점은 그것이 간헐적 인 것입니다. 어떤 학생들은 한번도 문제를 겪지 않았고, 다른 학생들은 계속해서 문제를 겪은 적이 있습니다. 개인적으로 교과 과정이나 도서관 자체 개발을위한 모델 솔루션을 개발하는 과정에서 개인적으로 만난 적이 없습니다.

제 질문은 양식 수명주기의 어느 시점에서 컨트롤이 처리되고 따라서 업데이트 스레드를 중지시키는 코드를 어디에 두는 것이 가장 좋을까요? 현재이 코드는 Dispose 메소드의 양식에 있으며, 다른 곳에 두는 것이 더 좋을까요?

답변

1

어떻게 스레드를 중지 하시겠습니까? 창을 닫기 전에 멈추는 것이 확실합니까? 스레드 루프에서 플래그를 설정하여 중지해야합니다. 그런 다음 스레드가 종료 될 때까지 기다려야합니다.

스레드

while (running) 
{ 
    // thread stuff 
} 

양식

thread.running = false; // or use your own Stop() method that does the same thing 
thread.Join(); 

당신이 스레드를 확인해야 대답하는 시스템이 정지 신호를 얻는 짧은 시간 내에 종료 할 수 있습니다합니다.

+0

예 플래그를 설정하고 있지만 스레드를 수행하지 않습니다 .Join(), 문제 일 수 있습니다. – RobV

+0

Join()은 다른 스레드가 종료 될 때까지 UI가 계속되지 않도록합니다. –

관련 문제