无法在ListView跨线程中获取项目

Wil*_*Boy 2 c# listview backgroundworker thread-safety

我的后台工作者需要遍历ListView中的每个项目.但是我不能这样做:

foreach (ListViewItem Item in List.Items)
Run Code Online (Sandbox Code Playgroud)

因为它是一个跨线程操作.

我也不能将这些项放在ListView.ListViewItemCollection中并使后台工作者从中读取.这仍然是尝试访问ListView并创建跨线程操作.

如何将ListView的项目提供给后台工作程序,而无需将它们放在某个变量中?

小智 5

尝试使用此功能.

private delegate ListView.ListViewItemCollection GetItems(ListView lstview);

private ListView.ListViewItemCollection getListViewItems(ListView lstview)
{
    ListView.ListViewItemCollection temp = new ListView.ListViewItemCollection(new ListView());
    if (!lstview.InvokeRequired)
    {
        foreach (ListViewItem item in lstview.Items)
        temp.Add((ListViewItem)item.Clone());
        return temp;
    }
    else
        return (ListView.ListViewItemCollection)this.Invoke(new GetItems(getListViewItems), new object[] { lstview });
}
Run Code Online (Sandbox Code Playgroud)

像这样称呼它:

foreach(ListViewItem item in getListViewItems(List))
Run Code Online (Sandbox Code Playgroud)