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 ?
如何处理 Iterable.forEach 中的 IOException?
在 Xamarin Forms 的 Telerik ListView 中,如何处理 Windows 上元素的右键单击事件?