Invoke和<control>之间的区别.Invoke </control>

时间:2013-01-30 05:31:17

标签: c# winforms

Winforms应用程序。后台线程从MQ检索消息并在UI线程上进行更改。

我需要调用此方法来更新自定义列表

    private void UpdateList()
    {         
        if (ctrlLabel.IsHandleCreated)
        {
            ctrlLabel.Invoke(new Action(() =>
            {
                //Do Something
            }
            ));
        }

        ctrlListView.Data = package;

       //MARK
       ctrlListView.Invoke(new Action(() =>
        {
            ctrlListView.LoadData();
        }
        )); 
       //MARK           
    }

后台线程同时调用此方法。但是,这适用于控件刚刚实例化后的第一次调用。

在删除项目时,当我尝试刷新时,此错误会出现Null Exception Errors。

有趣的是,我能够通过一些小修改来运行它。我将[Control] .Invoke改为Invoke,它可以工作(仅用于第二次调用)

       //MARK
       Invoke(new Action(() =>
        {
            ctrlListView.LoadData();
        }
        )); 
       //MARK           

那么,Invoke和[control] .Invoke在操作方面有何区别?

见到Win7,.Net 4.0

1 个答案:

答案 0 :(得分:2)

[control].Invoke特定于该特定控件的调用,如果您使用Invoke,则它会引用this这是当前的表单。

所以:

   Invoke(new Action(() => ....

以上等于:

this.Invoke(new Action(() => ....

this是当前表单的位置。

  

在删除项目时,当我尝试刷新时,这会出现Null错误   异常错误。

如果您因null而控制delete,那么您将获得NRE。