关于.NET中 Control.Invoke

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 版权协议,转载请附上原文出处链接及本声明。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注