업데이트 :은 MSDN 문서 How to: Make Thread-Safe Calls to Windows Forms Controls입니다. 그것은 상태 :'크로스 스레드 작업이 유효하지 않음'은 WinForms 응용 프로그램을 죽이지 않습니다.
.NET Framework는 당신이 스레드에 안전하지 않은 방식으로 제어 에 액세스 할 때 을 감지하는 데 도움이됩니다. 디버거에서 응용 프로그램 을 실행하고, 해당 컨트롤을 호출하는 시도를 컨트롤을 만든 것보다 스레드 다른 하는 에서, 디버거가 메세지를 InvalidOperationException이 제기, "제어 컨트롤 이름 에서 액세스 스레드가 생성 된 스레드가 아닌 스레드입니다. "
이 예외는 디버깅 중에 발생하며 런타임에 상황에서 런타임에 안정적으로 발생합니다.
이전의 경험으로는 예외적으로 런타임에 예외가 발생했습니다.
올바른 방향으로 나를 가리키는 Spence에게 감사드립니다.
나는 윈폼 응용 프로그램에서 매우 일반적인 오류가 : 백그라운드 스레드는 UI 컨트롤을 액세스하는 대신 직접() Control.BeginInvoke를 사용하여.
내 문제는 다음과 같습니다. InvalidOperationException "크로스 스레드 작업이 유효하지 않습니다 : 'uxCheckStatus'가 생성 된 스레드 이외의 스레드에서 액세스되었습니다." 배경 스레드의 디버거에서는 WinForms 내부에서 삼켜진다.
나는 백그라운드 스레드와 전체 응용 프로그램을 죽일 것으로 예상된다.
또한 uxCheckStatus.Text = "success";
을 트리거하는 코드는 예외가 발생하는/후에 실행되기도합니다. 즉, 라벨 텍스트에 'success'가 표시됩니다. 나는 기본적으로 길을 잃었다. 이 문제가 발생하는 사람은 누구입니까?
완전히 새로운 WinForms 솔루션에서 버튼 하나 (ThreadPool 및 악의적 배경 스레드 용 스레드 모두 사용)에서 재현합니다.
백그라운드 스레드에서 새 InvalidOperationException()을 throw하면 응용 프로그램이 종료됩니다. 그래서 내 유일한 추측은 WinForms이 어딘가에이 특정 예외를 처리하지만 웹에서이 동작에 대한 참조를 찾을 수 없습니다.
나는 .NET 3.5을 실행 VS 2008
'MDA'란 무엇입니까? 그리고 '디자인'에 대한 언급이 있습니까? 나 자신을 반복하자 : 나는 'Control.BeginInvoke'를 사용해야한다는 것을 안다. 그리고 나는 그것을 사용하는 것을 잊었을 때 어플리케이션이 '실패해야한다'고 예외를 삼키지 않아야한다고 생각합니다. –
좋아요, 디버그 모드에 대해 언급 한 후 MSDN에서이 모드에 대한 참조를 발견했습니다. 감사합니다. –
MSDN에 어딘가에 묻혀 있다는 것을 알고있었습니다. 정보를 질문에 넣었을 때, 많은 사람들이 SO가 유용한 답변의 저장소로 설계되었다는 것을 알지 못합니다. 그런 유지 관리가이 사이트를 훌륭하게 만듭니다. 디버깅에 좋은 행운을 빕니다. 누군가 elses 코드를 읽는 것과 같은 것도 없습니다. – Spence