c# foreach块程序如何处理ListView?

Posted

技术标签:

【中文标题】c# foreach块程序如何处理ListView?【英文标题】:c# How to deal with ListView foreach block program? 【发布时间】:2021-09-23 09:24:42 【问题描述】:

c# foreach程序如何处理ListView线程? 我尝试更新签入列表, 如果我不使用 Task.Run(Threading),它会阻塞程序。 如果我使用Task.Run,​​它会导致InvalidOperationException

Task.Run(() =>
            
                // Cause System.InvalidOperationException
                foreach (ListViewItem item in liv.Items) 
                
                    var fullPath = item.SubItems["fullPath"].Text;
                    
                    foreach (var gl in geminiFileStructListForLV)
                    
                        if (fullPath.Equals(gl.fullPath))
                        
                            gl.Checked = item.Checked;
                        
                    
                
            );

【问题讨论】:

我认为您没有提供足够的代码来说明它首先被阻塞的原因。 首先尝试在BeginUpdate() 和EndUpdate() 调用之间更新您的ListView。否则,ListView 控件有一个VirtualMode 可以提高其性能(因为您一次只处理一小批项目并且您只需要更新其数据源)。 -- 一个例子here. 【参考方案1】:

首先,gl.Checked = item.Checked; 是不允许的。因为您不能修改foreach iteration variable 的成员。您必须将您的 foreach 更改为 for

其次,跨线程操作对控件无效。这只是意味着您不能使用由主线程在另一个线程中创建的控件

避免循环阻塞程序的最简单方法是在循环的每个循环中调用Application.DoEvents();

foreach(ListViewItem item in liv.Items)

    var fullPath = item.SubItems["fullPath"].Text;

    for(var i = 0; i < geminiFileStructListForLV.Length; i++)
    
        if(fullPath.Equals(geminiFileStructListForLV[i].fullPath))
        
            geminiFileStructListForLV[i].Checked = item.Checked;
        

        Application.DoEvents();
    

【讨论】:

我可以在 foreach 中修改值,因为 Check in 类已设置属性。

以上是关于c# foreach块程序如何处理ListView?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理完成处理程序块中取消的 NSURLSessionTask ?

如何处理 Listview 中的单击事件?

如何处理 Iterable.forEach 中的 IOException?

在 Xamarin Forms 的 Telerik ListView 中,如何处理 Windows 上元素的右键单击事件?

Selenium C#如何处理警报“打开选择一个应用程序”?

如何处理android中Listview中的点击事件?