0

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

4

1 回答 1

2

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

所以:

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

以上等于:

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

this当前表格在哪里。

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

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

于 2013-01-30T05:33:48.277 回答