0

我已经知道要更新控件,我可以使用 Invoke Action

progressBar1.Invoke(new Action(() => { progressBar1.Maximum = 0; }));

但这仅适用于单一数据的控制属性。现在我有一个线程需要更改列表视图项的列表视图集合,清除它然后使用新项目、新文本和图标图像进行更新。它们之间有什么不同,整数或布尔值与列表、数组或整数、布尔值甚至组件、控件的集合相比。我可以简单地添加吗

string[] newItemText = {"item1", "item2", ...};
listView1.Invoke(new Action() => {
    i = 0;
    foreach(var item in listView1.Items)
    {
         item.Text = newItemText[i];
         i++; 
    }
}));

我可能需要我的列表视图的解决方案,但如果您有答案,请清楚地解释它为什么以及如何工作,因为我需要彻底了解它。你也可以在尝试这种做法时注意到我的风险。

编辑:问题不在于如何从其他线程更新控制。IT 关于何时以及为什么需要这样做而不是那样做。此外,我需要知道更新单个数据和更新整个数据集合之间的区别。

4

1 回答 1

1

更新值或向列表添加更多元素没有区别。

内部发生的是用于在 Windows 中绘制的图形资源(它也可以应用于 Android),它需要使用 Pen、Brushes 和那些类型的对象。

这些对象属于最初实例化它们的线程的上下文。这通常发生在主线程中,但是如果您要在与主线程不同的单独线程中创建图形对象(在本例中为列表),则该特定线程将是您控件的“所有者”线程。

如果您想更改控件中需要刷新 UI 的某些内容(需要使用钢笔、画笔等),您必须从“拥有”控件的同一线程执行此操作。这就是您需要使用 Invoke 的原因。

这是主要原则。如果将标量值更新为整数,或者将元素添加到列表中,则没有区别。两者都需要使用图形资源,因此都需要从拥有控件的同一线程调用。

让我知道是否清楚。

编辑。无论如何,您的代码看起来有点奇怪,因为您正在填充 List 从自己的列表迭代。这样做不是更有意义吗?:

string[] newItemText = {"item1", "item2", ...};
listView1.Invoke(new Action() => {
   for(int i = 0; i < newItemText.length; i++)
   {
     listView1.add(newItemText[i]);
   }
});

在不知道其余上下文的情况下,这对我来说听起来更合乎逻辑。

于 2017-02-10T08:17:19.420 回答