C#의 WinForms를 사용할 경우 종종 겪는 경우인데,
GUI 쓰레드가 아닌 다른 쓰레드에서 GUI를 변경할 경우 Exception이 발생하며 프로그램이 종료될 수 있다.
아마도 InvalidOperationException 예외였던 것으로 기억이 난다.
이 경우 아래 코드 형식대로 InvokeRequired 프로퍼티를 확인해서 Invoke() 함수에 delegate를 넣어서 호출해 주어야 한다.
private delegate void SetControlPropertyThreadSafeDelegate(Control control, string propertyName, object propertyValue); public static void SetControlPropertyThreadSafe(Control control, string propertyName, object propertyValue) { if (control.InvokeRequired) { control.Invoke(new SetControlPropertyThreadSafeDelegate(SetControlPropertyThreadSafe) , new object[] { control, propertyName, propertyValue }); } else { control.GetType().InvokeMember(propertyName, BindingFlags.SetProperty, null, control, new object[] { propertyValue }); } }
이는 MFC, Qt 등의 다른 GUI 에서도 동일하게 나타나는 현상으로
MFC에서는 Window Message를, Qt에서는 signal/slot으로 GUI 쓰레드에게 대신 일을 시켜야 한다.