ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C# Form UI 접근과 Invoke
    Software/C# 2024. 5. 23. 15:31
    728x90

    C# Form 을 사용하다보면 크로스 쓰레드 오류를 심심찮게 마주하게된다.

    이는 서로 다른 쓰레드에서 UI의 값을 사용하려고 할 때 발생하는 오류로, 동기화가 이루어 지지 않았을 때 치명적인 오류를 유발할 수 있는 사항이다.

    크로스 쓰레드를 피하기 위해서는 하나의 쓰레드만 UI접근을 허용하도록 하거나, UI접근구역을 Lock하여 동기화를 시키면 된다.

     

     

    Task.Run


    보통 메세지 루프를 돌거나 여타 쓰레드 작업을 처리해야 할 때 C#에서는 Thread를 직접 실행할 수도 있지만 Task.Run을 사용할 수도 있다. Task는 내부적으로 직접 관리하는 ThraedPool에서 쉬고 있는 Thread를 불러와 작업을 시킨다. 따라서 Task를 사용하는 것만으로도 사용자는 스스로 Thraed를 관리하지 않아도 되어 편하다는 장점이 있다. 하지만 이 Tread작업 내부에서 UI에 접근한다면 크로스 스레드 문제가 발생할 것이다.

    이 때 해결방안중 하나가 Invoke를 사용하여 UI접근을 Main Thread에 넘기는 것이다. Invoke를 사용하면 해당 작업의 권한이 Invoke로 넘어가게 되고, 작업을 진행하던 쓰레드는 Invoke가 끝날때까지 대기 혹은 ThreadPool로 쉬로 들어간다.

     

     

    쓰레드 발생

    간혹 이 Invoke 대기 때문에 Thread와 MainThread간의 교착상태가 발생하기도 하는데, 이 때는 BeginInvoke키워드를 사용하면, Thread가 Invoke 작업을 기다리지 않고 다음 작업으로 넘어가므로 교착상태를 피할 수 있게 된다.

     

     

     

    728x90