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 (0) | 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 |