c# - 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;
}
}
}
});
解决方案
首先,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();
}
}
推荐阅读
- python - 计算图形的方向以将其拉直(在python中)
- python-3.x - 如何仅针对 spaCy 中的特定实体标签进行训练?
- javascript - 用于自动下载视频的书签
- sql - 如何在同一年的几个月中过滤多个条件?
- r - 使用 for 循环创建多个 ggplots
- spring-integration - 在spring集成中成功发送到jms队列后重命名源目录中的文件。使用 ExpressionEvaluatingRequestHandlerAdvice
- wordpress - 如何修复 WordPress kses 错误和致命错误处理程序
- python - 从另一个列表中创建一个满足条件的值列表
- android - Exoplayer - 如何仅播放 FragmentStatePagerAdapter 中可见的当前屏幕?
- android - ConnectivityManager.NetworkCallback 没有按要求工作