블로그 이미지
대갈장군

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

Notice

2012. 12. 13. 03:44 프로그래밍

WinForms는 작업 (예를 들자면 윈도우 디스플레이, 이벤트 처리 등등)을 하기 위해서 Native Windows System Assembly들을 사용한다. 


Thread Safe 하다는 것은 Multiple Threads 들이 하나의 오브젝트의 상태를 동시에 접근하여 변경하려고 하더라도 그 오브젝트의 '상태 (State)' '일관성있게' (Consistent) 유지한다는 것을 의미한다. 


Windows 폼 컨트롤의 "State" (상태)라고 하는 것은 텍스트 박스 안의 텍스트 같은 것을 말한다. 체크 박스를 예로 들자면 체크 상태를 말하는 것이다.


Multithreaded 환경에서 스레드에 안전하지 않은 (Non-Thread-Safe) 오브젝트를 사용하는 것은 상태의 오염 (State Corruption)을 가져 올 수 있다. 


이런 점을 피해가기 위해서 등장한 것이 바로 "Thread Apartment"라고 불리는 컨셉이다. 이것은 두가지 종류가 있는데 하나는 Single Threaded (STA)이고 다른 하나는 Multithreaded (MTA) 이다. A는 Apartment의 약자이다. .NET의 기본적인 디폴트 값은 MTA이다.


프로세스가 STA (Single Threaded Apartment) 모드로 작동한다고 가정하면 그 코드는 오직 하나의 스레드에서만 돌아간다는 말이다. 이런 STA 모드는 UI Application의 경우 아무런 효용 가지가 없다. 왜냐면 백그라운드 스레드로 작업을 할 수가 없기 때문이다. 


그래서 .NET은 WinForms Application을 Multithreaded로 생성하는 대신 폼의 내부에 속한 각각의 컴포넌트(예를 들자면 텍스트 박스)에 대해 그 컴포넌트가 생성되었던 스레드를 기억해 두었다가 사용자가 생성되었을 당시 사용되었던 스레드가 아닌 다른 스레드를 이용해서 해당 컴포넌트를 호출하거나 사용하려 하면 Exception이 발생하게 된다. 


InvokeRequired() 함수는 기본적으로 컴포넌트가 생성될 당시의 스레드 ID와 현재의 스레드 ID를 비교하는 함수이다.



posted by 대갈장군