델리게이트 형식의 변수에서 BeginInvoke를 호출하면 내부적으로 어떻게됩니까?스레드에서 사용되는 대리인은 무엇입니까?
답변
이것은 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를 구현하는 다른 개체가 있지만 대부분 자체 스레드를 관리하고 실행하는 개체입니다. 이러한 개체는 대리인 큐를 유지하고 해당 큐에서 사용자 개체를 추가하여 해당 스레드에서 실행합니다.
- 1. ASIHTTPRequest의 다른 대리인은 비동기입니까?
- 2. uitextfield 대리인은 파일 소유자 여야합니까?
- 3. Java에서 Collections.sort() 스레드 안전에 사용되는 Comparator는 무엇입니까?
- 4. java.lang.Math에서 사용되는 알고리즘은 무엇입니까?
- 5. JavaScript에서 사용되는 $ 기호는 무엇입니까?
- 6. 스레드에서 텍스트를 검색하는 방법은 무엇입니까?
- 7. 스레드에서 이미지를 구성하는 방법은 무엇입니까?
- 8. 한 스레드에서 변수를 안전하게 읽고 다른 스레드에서 수정하려면 어떻게해야합니까?
- 9. CakePHP에서 사용되는 .ctp 파일은 무엇입니까?
- 10. C++에서 사용되는 '~'는 무엇입니까?
- 11. delloc 기능이 사용되는 이유는 무엇입니까?
- 12. 요즘 사용되는 CGI 스크립트는 무엇입니까?
- 13. NSArray에서 사용되는 정렬 함수는 무엇입니까?
- 14. TUI가 상점에서 사용되는 이유는 무엇입니까?
- 15. 주로 사용되는 콘솔 앱은 무엇입니까?
- 16. 숨겨진 필드가 사용되는 이유는 무엇입니까?
- 17. 잘못된 경로가 사용되는 이유는 무엇입니까?
- 18. Hibernate에서 사용되는 AttributeOverride 어노테이션은 무엇입니까?
- 19. 필터 매핑에 사용되는 용어는 무엇입니까?
- 20. 여러 스레드에서 Console.WriteLine 호출
- 21. C에서 사용되는 데이터 유형
- 22. 예외가 보조 스레드에서 발생하는 경우 주 스레드에서 예외를 catch하는 방법?
- 23. 스레드에서 무료를 호출하면 프로그램이 중단되는 이유는 무엇입니까?
- 24. 실행중인 스레드에서 "java.lang.OutofMemoryError"의 가능한 원인은 무엇입니까?
- 25. none-name 스레드에서 textbox를 추가하는 방법은 무엇입니까?
- 26. 여러 스레드에서 정보를 얻는 방법은 무엇입니까? Java
- 27. BackgroundWorker 스레드에서 예외를 처리하는 방법은 무엇입니까?
- 28. 분리 된 스레드에서 NSUrlConnection을 실행하는 방법은 무엇입니까?
- 29. 백그라운드 스레드에서 이미지를 미리로드하는 방법은 무엇입니까?
- 30. performSelectorInBackground 스레드에서 UITextView를 업데이트하는 방법은 무엇입니까?