Control.Invoke含义是将方法委托给拥有该Control的线程去执行。
其实就是把Invoke里的内容委托给Control所在的线程去执行。如果是this.Invoke,就相当于Invoke里的内容是在主线主线程里运行的(这里默认this主窗口)
实例代码:
this.Invoke((EventHandler )delegate
{
YzmForm yzm = new YzmForm();
yzm.SetYzm(img);
if (yzm.ShowDialog( this) == DialogResult.OK)
{
this._yzm = yzm.GetYzm();
}
});
对于跨线程操作UI控件很好用,可以直接在子线程中把代码委托给主线程执行。
因为夸线程访问控件容易引起问题。所以推荐是谁创建谁调用原则。因为进度条是FORM的子控件,所以用THIS.INVOKE来委托主窗体去调用
补充:这种方式不能在窗体构造函数中使用,会报错:在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。
可以用下面的方式:
public void InsertLog(string log)
{
if (listBoxLog.InvokeRequired)
{
this.Invoke( new MethodInvoker(delegate ()
{
InsertLog(log);
}));
}
else
{
string t = "【" + DateTime .Now.ToString("HH:mm:ss") + "】";
listBoxLog.Items.Add(t + log);
}
}
本文为“技术点滴”的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。