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 쓰레드에게 대신 일을 시켜야 한다.


+ Recent posts