본문으로 바로가기

Invoke 함수란 무엇인가?

category 프로그래밍/C# 2018. 1. 26. 21:40

Invoke 함수란 무엇인가?

(법, 규칙등을)들먹이다. (누구의 이름을)부르다, (프로그램등을)불러오다.

하나의 Form을 다른 thread에서 접근하게 될 경우에 기존의 Form과 충돌이 날 수 있다. 

이 때 invoke 를 사용하여 실행하려고 하는 메소드의 대리자(delegate)를 실행시키면 된다.


예를 들어  myFormControl.Invoke(myformControl.myDelegate) 인자로 받은 

Form Instance/form에 딸린 Invoke/인자로 받은 Form Instance에 들어 있는 함수를 대리하는 Delegate



멀티스레드 환경에서 데이터 보호를 위해 Invoke를 써야 합니다.


응용 프로그램이 실행될 때 기본적으로 하나의 스레드가 발생합니다. 

이것을 Main 스레드라고 부르는 이유는 Main() 함수가 이 스레드의 시작점이기 때문입니다.

Main() 함수를 보시면 폼을 띄우죠? 결국 메인 스레드가 메인폼의 이벤트 처리를 담당하면서 

메인폼의 각종 컨트롤들의 값을 읽고 쓰는 작업을 수행합니다.


메인폼에서 다른 폼을 띄울 경우에도 기본적으로 메인 스레드가 자식 폼의 컨트롤들까지 모두 소유합니다. 

그런데, 별도의 스레드에서 폼의 컨트롤을 액세스하면 데이터(컨트롤?)가 깨질 수 있습니다. 

멀티스레드에 관해 조금이나마 공부해 보셨다면 이해하실 겁니다.


따라서, 별도의 스레드는 메인 스레드에게 컨트롤을 읽고 쓰는 작업을 위임하여 수행하게 하면 안전하겠죠.

그래서, 외부 스레드가 메인폼의 Invoke 를 호출하는 것입니다. 

[별도의 스레드]에서 [main_form.Invoke(xxx) 를 호출] 한다는 것은, 

[별도의 스레드]가 [main_form 을 소유한 스레드]에게 [xxx 함수의 호출을 위임]한다는 뜻 입니다.