月度归档: 2014 年 5 月

  • 关于.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);
        }    
    }