首页 > 解决方案 > c# foreach块程序如何处理ListView?

问题描述

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;
                        }
                    }
                }
            });

标签: c#winformslistview

解决方案


首先,gl.Checked = item.Checked;不允许。因为您不能修改foreach iteration variable. 你必须改变你foreachfor

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

避免循环阻塞程序的最简单方法是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();
    }
}

推荐阅读