C# Can';无法在ListView交叉线程中获取项目

C# Can';无法在ListView交叉线程中获取项目,c#,listview,thread-safety,backgroundworker,C#,Listview,Thread Safety,Backgroundworker,我需要在一个列表中遍历每个项目。但是我不能这样做: foreach (ListViewItem Item in List.Items) 因为这是一个跨线程的操作 我也不能把项目放在一个文件夹中,让后台工作人员从中读取。这仍在尝试访问并创建跨线程操作 如何使的项对后台工作人员可用,而不将它们放在某个变量中?尝试使用此函数 private delegate ListView.ListViewItemCollection GetItems(ListView lstview); private Li

我需要在一个列表中遍历每个项目。但是我不能这样做:

foreach (ListViewItem Item in List.Items)
因为这是一个跨线程的操作

我也不能把项目放在一个文件夹中,让后台工作人员从中读取。这仍在尝试访问并创建跨线程操作


如何使的项对后台工作人员可用,而不将它们放在某个变量中?

尝试使用此函数

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 });
}
可以这样称呼:

foreach(ListViewItem item in getListViewItems(List))
试试这个

public Form1()
{
    InitializeComponent();

    Control.CheckForIllegalCrossThreadCalls = false;
}

我同意mdb,但必须指出,根据应用程序的重要性

Control.CheckForIllegalCrossThreadCalls=false


仍然可以用作临时快速修复

有一种方法可以禁用非法的跨线程操作检查,但确切的解决方案是将数据放入数据访问对象或变量中,并在后台操作完成时更新列表视图。这是错误的建议。虽然它将消除错误消息,但您仍然会在没有任何同步的情况下进行跨线程调用,这可能会破坏您的结果。正确答案包括使用代表,如另一个答复中所述。