从另一个线程读取ListView SelectedItems集合

问题描述 投票:0回答:1

我正在尝试从后台线程对Windows Forms应用程序上的ListView中的选定项目执行一些操作。我的代码中有一个委托方法,如下所示:

private delegate ListView.SelectedListViewItemCollection dlgGetSelectedJobs();

private ListView.SelectedListViewItemCollection GetSelectedJobs()
{
    if(listViewJobViewer.InvokeRequired)
    {
        var dlg = new dlgGetSelectedJobs(GetSelectedJobs);
        return listViewJobViewer.Invoke(dlg) as ListView.SelectedListViewItemCollection;
    }
    return listViewJobViewer.SelectedItems;
}

这在后台线程的其他地方使用以下命令进行调用:

                    foreach(ListViewItem job in GetSelectedJobs())
                    { 
                        // Do stuff
                    }

但是,无论何时代码进入foreach循环,我都会遇到一个跨线程异常,我不确定为什么...非常感谢收到任何帮助!

c# multithreading winforms
1个回答
-1
投票

感谢蒙珠的帮助!

我已经设法通过更改委托方法以使用Linq根据ListView中的选定项返回List来解决此问题:

private delegate List<ListViewItem> dlgGetSelectedJobs();

private List<ListViewItem> GetSelectedJobs()
{
    if(listViewJobViewer.InvokeRequired)
    {
        var dlg = new dlgGetSelectedJobs(GetSelectedJobs);
        return listViewJobViewer.Invoke(dlg) as List<ListViewItem>;
    }
    return (from ListViewItem i in listViewJobViewer.SelectedItems select i).ToList();
}

我仍然不确定为什么当我尝试返回集合时为什么它不起作用,但这似乎可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.