MSDN에 따르면, "이 BackgroundWorker
클래스는 별도의 전용 스레드에서 작업을 실행할 수 있습니다."
BackgroundWorker
Form.Invoke()
을 사용하면 제어를 주 UI 스레드로 전환하여 진행 상황을보고 할 수 있습니다. 사실 BackgroundWorker
은 자신을 쉽게 작성할 수있는 도우미 클래스 일뿐 아니라 두 번째 스레드를 사용하여 작업을 수행하지만 GUI에 액세스하기 위해 기본 UI 스레드로 전환합니다.
또한 MSDN에서 : "작업 진행 상황을보고하고 작업 완료시 신호를 보내는 이벤트를 수신 할 수 있습니다." 이는 백그라운드 작업이 별도의 스레드에서 실행되며 해당 스레드에서 GUI에 액세스 할 수 없음을 의미합니다. 그러나 UI UI 스레드에서 발생하기 때문에 진행 이벤트에서 GUI 컨트롤에 액세스 할 수 있습니다. 작업자 스레드에서 BackgroundWorker.ReportProgress()
을 호출 할 때마다 주 스레드에서 BackgroundWorker.ProgressChanged
이벤트가 발생합니다.
또한 다른 스레드에서 GUI에 액세스 할 수없는 이유를 묻습니다. 전체 Windows GUI 하위 시스템이 스레드로부터 안전하지 않기 때문입니다. 필자가 아는 한, 이것은 다른 플랫폼 (Windows 외부)에서도 꽤 정상적이므로 마이크로 소프트에만 국한된 것은 아닙니다. 아마도 역사적인 이유로 아마 코드 효율성과 관련이 있습니다. (스레드 안전 GUI는 느려질 것입니다.) 그러나 나는 어떤 강력한 정보 소스를 참조로 제공 할 수 없습니다.
나는 "일부 .NET 마술"이라고 부르지 않을 것입니다. 단지 Invoke 호출 일뿐입니다. –