Invoke와 BeginInvoke의 목적
- UI 컨트롤박스를 생성하게 되면 내부 스레드가 자동으로 생성되는데 별도의 스레드를 생성하여 해당 컨트롤 박스에 접근하려 하면 서로 다른 스레드가 하나의 컨트롤 박스 객체에 접근을 하게 되는데, 이 때 교착상태(크로스 스레드, Cross Thread)가 발생하여 Invoke 또는 BeginInvoke를 사용하여 해당 크로스 스레드 문제를 방지하는데 목적이 있다.
- C# Form 프로그래밍에서는 Main Thread(UI Thread)와 Other Thread(Work Thread)로 분리되어 작업이 된다. Other Thread에서 Main Thread의 UI 작업을 하려고 하면 불가능하다. 왜냐하면 컨트롤을 생성한 Main Thread에서만 접근이 가능해서 작업을 하려고 하면 Cross Thread Exception이 발생하기 때문이다. 이 때 필요한 것이 Invoke와 BeginInvoke이다. 그리고 Main Thread인지 Other Thread인지 구별해주는 InvokeRequired 속성이 있다. Invoke가 필요한 Thread(Other Thread)라면 True, 필요하지 않은 Thread(Main Thread, UI Thread)라면 False를 반환한다.
Invoke와 BeginInvoke의 차이점
- Invoke : 컨트롤의 본인 스레드가 아닌 다른 스레드를 이용하여 해당 컨트롤 객체를 동기식으로 실행하는 방법이다.
- BeginInvoke : 컨트롤의 본인 스레드가 아닌 다른 스레드를 이용하여 해당 컨트롤 객체를 비동기식으로 실행하는 방법이다.
[출처]
https://jongwuner.github.io/c%23/2019/08/24/Invoke-vs-BeginInvoke/
https://jeongkyun-it.tistory.com/90
'C#' 카테고리의 다른 글
불변성과 가변성(공변성, 반공변성) (0) | 2022.12.15 |
---|---|
Call By Reference(값에 의한 전달) - ref, out (0) | 2022.12.15 |
Action/Func/Predicate (0) | 2022.12.12 |
.NET Reflection을 이용한 메서드 호출 (0) | 2022.12.02 |
그라데이션이 포함된 이미지를 배경으로 한 Form 만들기 (1) | 2022.12.02 |