닷넷 폼 컨트롤들은 컨트롤핸들이 속한 쓰레드 외에서 접근하려 하면 예외를 발생시킨다.
그래서 다른 쓰레드에서 접근하려면 Invoke 함수를 통해 접근해야한다.
현재 쓰레드에 컨트롤 핸들이 속했는지를 알기 위해서는 Control 클래스의 InvokeRequired 속성을 참조하면 된다.
이 속성이 true일 경우에만 Invoke함수를 쓸 필요가 있는 것이다.
public object Invoke(Delegate method);
public object Invoke(Delegate method, params object[] args);
이 Invoke함수는 method로 넘긴 delegate함수를 컨트롤핸들이 속한 쓰레드에서 실행할 수 있도록 해준다.
파라미터가 필요한 경우는 두번째 함수를 쓰면 된다.
비동기적으로 쓰고 싶으면 BeginInvoke, EndInvoke를 쓰면 된다.
(Invoke, BeginInvoke, EndInvoke, CreateGraphics 외의 함수를 다른 쓰레드에서 호출하면 예외가 발생된다.)
다음은 내가 짜서 쓰고 있는 클래스..
static class ControlProperty
{
delegate void PropertySetter(object control, string propertyName, object value);
private static void Setter(object control, string propertyName, object value)
{
try
{
Type type = control.GetType();
PropertyInfo prop = type.GetProperty(propertyName);
prop.SetValue(control, value, null);
}
catch
{
}
}
public static void Set(object control, string propertyName, object value)
{
if (control is Control)
{
Control ctrl = control as Control;
if (ctrl.InvokeRequired)
ctrl.Invoke(new PropertySetter(Setter), control, propertyName, value);
else
Setter(control, propertyName, value);
}
}
}
사용예
ControlProperty.Set(nicknameTextBox, "Enabled", false);
ControlProperty.Set(nicknameTextBox, "Text", string.Empty);