2009-03-19 3 views

답변

2

이것은 BeginInvoke를 호출하는 개체 유형에 따라 다릅니다.

ISynchronizeInvoke은 BeginInvoke를 정의하는 인터페이스입니다. 해당 인터페이스를 구현하는 객체에 대리자를 전달하고 해당 객체는 자체 스레드에서 실행되도록 스레드를 예약합니다.

이 인터페이스를 구현하는 개체가 몇 가지 있습니다. WPF의 Dispatcher는이 작업을 수행합니다. Dispatcher에서 BeginInvoke를 호출하면 해당 대리자가 Dispatcher의 대기열에 추가되고 적절할 때 실행됩니다.

Windows Forms의 Control 기본 클래스는 ISynchronizeInvoke도 구현합니다. (이 질문에 대한 답변이 될 수도 있습니다.) Windows Forms에서는 상황이 훨씬 더 복잡합니다. 세부 사항을 설명하는 Here is a great article. 기본적으로 winforms 컨트롤에서 BeginInvoke를 호출하면 특별한 marshaller가 프로그램에 전달되는 Windows 메시지를 만들고 UI 스레드는 대리자를 실행 대기열에 대기시킵니다. 그것은 그보다 조금 더 복잡합니다 (그 기사에서 묘사 된 것처럼),하지만 그것은 기본 아이디어입니다. 그런 다음 대리인은 기본 UI 스레드에서 실행됩니다.

ISynchronizeInvoke를 구현하는 다른 개체가 있지만 대부분 자체 스레드를 관리하고 실행하는 개체입니다. 이러한 개체는 대리인 큐를 유지하고 해당 큐에서 사용자 개체를 추가하여 해당 스레드에서 실행합니다.

관련 문제