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

时间:2011-11-05 19:49:26

标签: c# listview thread-safety backgroundworker

我的background worker需要遍历ListView中的每个项目。但是,我不能这样做:

foreach (ListViewItem Item in List.Items)

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

我也无法将这些项目放在ListView.ListViewItemCollection中,并让后台工作人员从中读取。这仍然是在尝试访问ListView并创建跨线程操作。

如何将ListView项目提供给后台工作人员,而不将其置于某个变量中?

3 个答案:

答案 0 :(得分: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 });
}

这样称呼:

foreach(ListViewItem item in getListViewItems(List))

答案 1 :(得分:1)

我同意mdb,但必须提及取决于应用程序的重要性,

Control.CheckForIllegalCrossThreadCalls = false;

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

答案 2 :(得分:-2)

试试这个。

public Form1()
{
    InitializeComponent();

    Control.CheckForIllegalCrossThreadCalls = false;
}