WinForm多线程修改控件时,提示在“创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke”报错信息,并且如果没有捕获到,则可能导致程序崩溃,直接关闭。
百度之后,发现需要判断控件的IsHandleCreated和IsDisposed等属性,并且如果还有错误,可以再捕获InvalidOperationException异常,避免程序崩溃,每次涉及到UI变动的地方都这么判断的话,则太麻烦。
此时,最好是自己写一个类,专门负责处理多线程UI调用,代码如下:
public static class ControlInvoker
{
public static void Invoke(Control ctl, MethodInvoker method)
{
if (!ctl.IsHandleCreated)
return;
if (ctl.IsDisposed)
return;
if (ctl.InvokeRequired)
{
ctl.Invoke(method);
}
else
{
method();
}
}
}
调用方法如下:
ControlInvoker.Invoke(this, delegate
{
btnRefresh.Enabled = true;
});