
C#을 사용하여 GUI를 Visual Studio를 사용하여 구성하는 방법에는 크게 Winform(윈폼)과 WPF 두가지가 존재합니다.
WPF는 Dispatcher Checker를 사용하여 UI Thread가 아닌 다른 Thread를 판단한다면
Winform의 경우에는 InvokeRequired를 사용하여 UI Thread가 아닌 다른 Thread에서 접근하려고 하는지 판단합니다.
InvokeRequired
해당 Property는 System.Windows.Forms.Control에 정의된 Property로, 해당 컨트롤이 UI Thread 이외의 Thread에서 컨트롤에 접근하려고 할 때 Invoke 혹은 BeginInvoke를 사용해야하는지 유무를 반환하는 Property입니다.
즉, UI Thread 이외의 Thread에서 해당 컨트롤에 접근할 때 Invoke, BeginInvoke 호출을 해야한다고 알려주는 플래그 입니다.
InvokeRequired를 사용하지 않고 접근할 때

위의 스크린샷은 TimeTaskFunc 라는 Task에서 수행하는 함수에서 lblTime 이라는 LabelControl의 속성값인 Text에 접근하려고 하여 예외인 System.InvalidOperationException이 발생하였습니다.
UI Thread가 아닌 다른 Thread(Task)에서 UI 컨트롤을 접근하려고 하여 이러한 문제가 발생한 것입니다.
InvokeRequired를 사용하기

lblTime에 InvokeRequired값을 확인하여 BeginInvoke 또는 일반 접근을 하도록 변경하였습니다.
위의 코드처럼 하는 경우 보다는
public static class ExtensionClass
{
public static void SetText(this Control ctrl, string text)
{
if (ctrl.InvokeRequired)
{
ctrl.BeginInvoke((Action)(() => ctrl.SetText(text)));
return;
}
ctrl.Text = text;
}
}
위와 같은 확장 메서드 SetText를 만들고

이렇게 많이 사용합니다.
'Study > C#, Winform' 카테고리의 다른 글
| [C#] 바이트 배열 다루기 : BitConverter (0) | 2023.08.16 |
|---|---|
| [C#] 바이트 배열을 이용한 비트 다루기 : BitArray (2) | 2023.07.15 |
| [C# Winform] PropertyGrid 에서 DisplayName 우선순위 (0) | 2022.12.26 |
| [C#] 배열 정렬 기능 (Sort) (0) | 2022.12.10 |
| [C# Winform] DataGridView Column Header Drag (컬럼 헤더 드래그) (0) | 2022.10.24 |