问题
C#程序窗口关闭时,会报错:“System.InvalidOperationException”类型的未经处理的异常在 System.Windows.Forms.dll 中发生 其他信息: 在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。
程序代码
为了让lable的文字内容方便修改,将其封装成可调用的函数:
private void Notify_Set(string text)
{
lbNotify.Invoke((MethodInvoker)delegate
{
lbNotify.Text = text;
});
}
线程函数如下:
private void Thread_Test()
{
Thread.Sleep(1000);
while (g_ifToolRun)
{
Notify_Set("Have not device connect");
}
}
在窗口初始化完成后启动线程:
public TestProgram()
{
InitializeComponent();
Thread mThread = new Thread(() => Thread_Test());
mThread.Priority = ThreadPriority.Highest;
mThread.Start();
}
在程序关闭时即会报错:
尝试解决
参考其他类似的问题,用控件的IsHandleCreated方法来做判断,有句柄时才执行Invoke:
private void Notify_Set(string text)
{
if(lbNotify.IsHandleCreated) //这里判断句柄是否有创建
{
lbNotify.Invoke((MethodInvoker)delegate
{
lbNotify.Text = text;
});
}
}
运行结果依然是会报错:
提问
这种情况应该怎么避免该报错?是程序上哪里写不对还是这个IsHandleCreated方法在某种情况不适用?