最近在学习用C#开发上位机程序,之前写了一段通过多线程实时更新UI界面的程序,那时候运行没有问题,最近再去运行却产生了“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke” 这个错误。
之前的代码:
delegate void Mydele();
private void Updatetask()
{
while (true)
{
Thread.Sleep(200);
this.BeginInvoke(new Mydele(UpdateQueueValue));//UpdateQueueValue是具体的控件操作
}
}
private void Mytask()
{
Task Comm1 = new Task(Updatetask, TaskCreationOptions.LongRunning);
Comm1.Start();
}
产生这个错误的时机是关闭这个窗体时发生。查了一些资料修改代码如下:
delegate void Mydele();
private void Updatetask()
{
while (true)
{
Thread.Sleep(200);
if (this.IsHandleCreated)
this.BeginInvoke(new Mydele(UpdateQueueValue));
}
}
private void Mytask()
{
Task Comm1 = new Task(Updatetask, TaskCreationOptions.LongRunning);
Comm1.Start();
}
感觉应该是关闭的时候控件被早于这个子线程关闭,导致产生这个错误,加上
if (this.IsHandleCreated) 用以判断这个控件是否还存在再去执行控件的更新程序。