여기에는 그럴 만한 (또는 적어도 괜찮은) 이유가 있을 것입니다. 어떤 이유일까요?
>. 내 생각에 이것은 훌륭한 질문 - >. 내가 생각하기에 더 필요 없다 >. 그 답이 있다. >. >. 그러나 할 수 있는 유일한 있기 때문입니다. >. 어딘가에 있는 프레임워크입니다 뭔가 특별한 게 있다 >. # 39, 스레드 isn& 있는 것은 아주.
그 " something"; 거의 모든 단일 인스턴스 멤버 각각의 단일 대한 제어권을 시스템.빈다우스윈포름스트
이 MSDN 문서가 아닌 경우, 많은 컨트롤을 조정하십시오 시스템.빈다우스윈포름스 모두야 말하도다 ", 모든 멤버가 공용 정적 (공유) 의 비주얼 베이직) 이 유형은 스레드할 금고에도요 모든 멤버가 인스턴스입니다 safe." 스레드할 보장받을 수 없는,
즉, 같은 인스턴스입니다 멤버 '테스트상자스테스트 {프레젠테이션이든. , 요각} '설정되었습니다 않습니다.
그 때문에 각 멤버가 될 수 있는 대부분의 응용 프로그램은 많은 오버헤드에 소개하십시오 인스턴스입니다 스레드할 안전하다구요 필요하지 않습니다. Net framework 의 디자이너들이 제대로 하고 있는 것이 아니라, 내가 생각하기에, 여러 개의 스레드로부터 온 액세스하려면 부담을 synchronizing 양식 제어를 합니다 에 올라 있다.
[편집]
비록 이 디렉토리에만 " 묻는 질문에 why"; 이 기사를 링크를 설명하는 how" ";:
여러 문제 중에서도 교착 상태에 빠지기 쉽기 때문입니다.
예를 들어, 보조 스레드가 UI 컨트롤을 업데이트하려고 하지만 UI 컨트롤이 보조 스레드에 의해 잠긴 리소스가 해제되기를 기다리므로 두 스레드가 서로 완료되기를 기다리는 상황이 발생할 수 있습니다. 다른 사람들이 언급했듯이 이러한 상황은 UI 코드에만 국한된 것은 아니지만 특히 흔한 현상입니다.
C++와 같은 다른 언어에서는 이 작업을 자유롭게 시도할 수 있지만(WinForms에서처럼 예외가 발생하지 않음), 교착 상태가 발생하면 애플리케이션이 멈추고 응답이 중지될 수 있습니다.
참고로, UI 스레드에 컨트롤을 업데이트하고 싶으면 델리게이트를 생성한 다음 델리게이트를 전달하여 해당 컨트롤의 (비동기) BeginInvoke 메서드를 호출하면 쉽게 알릴 수 있습니다. 예시
myControl.BeginInvoke(myControl.UpdateFunction);
이는 작업자 스레드에서 C++/MFC PostMessage를 수행하는 것과 동일합니다.
< br/>;
진짜 이유는, 더 많은 시간을 함께 할 경쟁 조건 및 고대 Win32 뒤로를 게 있다. 내가 여기서 키워드는 can& # 39, t 설명하란말야 자세한 이벤트와 미묘한 차이를 메시지일까요 펌프, WM_PAINT " SEND"; 그리고 POST" ";).
< br/>;
자세한 내용은 볼 수 있습니다. here 및 [here] [2].
[2]: # posting_sending http://msdn.microsoft.com/en-us/library/ms644927.aspx
1.0/1.1에서는 디버깅 중에 예외가 발생하지 않았으며, 대신 간헐적으로 런타임이 중단되는 시나리오가 발생했습니다. 잘됐네요! :) 따라서 2.0에서는 이 시나리오에서 예외가 발생하도록 만들었습니다.
실제 이유는 아마도 (아담 하일레가 말한 것처럼) 일종의 동시성/잠금 문제일 것입니다. 일반적인 .NET API(예: TextBox.Text = "Hello";;)는 즉각적인 조치가 필요한 SEND 명령을 래핑하므로 업데이트를 실행하는 스레드와 별도의 스레드에서 수행하면 문제가 발생할 수 있다는 점에 유의하세요. Invoke/BeginInvoke를 사용하면 대신 작업을 큐에 대기시키는 POST를 사용합니다.
SEND 및 POST에 대한 자세한 내용은 여기를 참조하세요.
두 가지가 동시에 컨트롤을 업데이트하지 않도록 하기 위해서입니다. (쓰기/읽기 도중에 CPU가 다른 스레드로 전환하면 이런 일이 발생할 수 있습니다). 여러 스레드 간에 공유 변수에 액세스할 때 뮤텍스(또는 다른 동기화)를 사용해야 하는 이유도 마찬가지입니다.
편집:
C++와 같은 다른 언어에서는
자유롭게 시도하고 수행 할 수 있습니다 ( 예외가 발생하지 않습니다. 예외가 발생하지 않습니다), 그러나 결국 배우게 될 것입니다. 배우게 될 것입니다!
아, 네... 저는 C/C++와 C# 사이를 전환하기 때문에 좀 더 일반적이었어야 했는데, 죄송합니다... 그의 말이 맞습니다. C/C++로도 할 수 있지만, 다시 돌아와서 당신을 물게 될 것입니다!