2013-09-21 4 views
0

두 스레드 (주 스레드 및 보조 스레드)를 사용하는 응용 프로그램을 닫을 때 간혹 크로스 스레드 예외가 발생합니다. 무슨 일이 일어나고있는 것 같아요, 메인 UI 쓰레드가 삭제되고있는 동안, 보조 UI가 여전히 실행 중이고, 보조 UI가 가끔 UI 쓰레드를 호출하기 때문에 충돌이 일어난다 고 생각합니다.응용 프로그램을 닫을 때 크로스 스레드 예외가 발생했습니다.

FormClosing 이벤트의 보조 스레드를 수동으로 닫아야합니까?

감사합니다.

+0

프레임 워크 4.0의 경우 작업을 사용하면 더 나은 결과를 얻을 수 있습니다. 또한이 무료 리소스가 도움이 될 수도 있습니다. http://www.albahari.com/threading/ – jcwrequests

+0

읽어 주셔서 감사합니다! – TheGateKeeper

답변

1

보조 스레드를 수동으로 닫아야합니까?

아니오 및 예.

아니요, 보조 스레드가 백그라운드 스레드 인 경우 아니요. 보조 스레드에서 IsBackground 속성을 검사하거나 설정할 수 있습니다. 전경 스레드가 더 이상 실행되지 않을 때 모든 백그라운드 스레드는 CLR에 의해 자동으로 중지됩니다. 예를 들어, 모든 ThreadPool 스레드는 백그라운드 스레드입니다.

그러나 보조 스레드에서 중요한 작업을 수행하고 갑자기 중지하지 않으려는 경우가 있습니다. 이 경우 보조 스레드를 중지하기 위해 적절한 논리를 구현해야합니다.

+0

보조 스레드가 중단되었을 때 나는 신경 쓰지 않았습니다. 그래서 내가해야만하는 것은 그것을 배경 스레드로 만드는 것입니다. 고마워 친구. – TheGateKeeper

1

멀티 스레드 창 응용 프로그램에서 권장되는 방법은 다른 스레드에서 생성 된 컨트롤을 직접 조작하는 대신 Method Invocation을 사용하는 것입니다. 이렇게하면 결코 Cross Thread Exception을 얻지 못할 것입니다. 예를 들어이 같은 텍스트 상자의 텍스트를 설정할 수 있습니다

form1.BeginInvoke(new MethodInvoker(()=>textbox1.text = "Hello!")); 

자세한 내용은 다음을 참조하십시오 http://msdn.microsoft.com/en-us/library/ms171728(v=vs.85).aspx

+0

@HansPassant 감사합니다. 코드를 수정했습니다. – Alireza

+0

이것은 질문과 아무 관련이 없습니다 ... – TheGateKeeper

1

을 당신이 장기 실행 전용 스레드가 있으면, 당신은 그것을 종료 로직을 ​​구현해야합니다. 이유는 간단합니다 : 적어도 하나의 스레드가 살아있을 때까지 응용 프로그램이 OS에 의해 종료되지 않습니다. 그리고 예, "메인 쓰래드"같은 것은 없습니다. 모든 쓰레드는 OS 관점에서 동등합니다.

을 감안할 때,이 앱 종료 할 계획 일단 당신이해야 그것을 자신의 스레드 PROC에서 종료 될 때까지 종료가 두 번째 스레드에 대한
  • 대기를 기대하는 두 번째 스레드에

    1. 신호

    이제 자유롭게 끝내십시오.

  • 관련 문제