C# 如何使用线程在listview中添加项目?
我有一个简单的代码,但这是不工作如何解决这个问题线程正在运行,但listview没有更新是什么问题,有人可以解释一下吗C# 如何使用线程在listview中添加项目?,c#,.net,multithreading,winforms,C#,.net,Multithreading,Winforms,我有一个简单的代码,但这是不工作如何解决这个问题线程正在运行,但listview没有更新是什么问题,有人可以解释一下吗 public Form1() { InitializeComponent(); listView1.View = View.Details; listView1.FullRowSelect = true; listView1.Columns.Add("Problems", 80); list
public Form1()
{
InitializeComponent();
listView1.View = View.Details;
listView1.FullRowSelect = true;
listView1.Columns.Add("Problems", 80);
listView1.Columns.Add("Data", 120);
listView1.Columns.Add("Registry Key", 130);
listView1.Columns.Add("users", 80);
Thread childThread = new Thread(getlist);
childThread.Start();
}
public void getlist()
{
int i;
for (i = 0; i < 40; i++)
{
add("a", "b", "c", "d");
}
}
public void add(string prob, string reg, string data, string user)
{
String[] row = { prob, reg, data, user };
ListViewItem item = new ListViewItem(row);
ListViewItem v = listView1.Items.Add(item);
item.Checked = true;
}
public Form1()
{
初始化组件();
listView1.View=View.Details;
listView1.FullRowSelect=true;
listView1.Columns.Add(“问题”,80);
listView1.Columns.Add(“数据”,120);
listView1.Columns.Add(“注册表项”,130);
listView1.Columns.Add(“用户”,80);
Thread childThread=新线程(getlist);
childThread.Start();
}
public void getlist()
{
int i;
对于(i=0;i<40;i++)
{
添加(“a”、“b”、“c”、“d”);
}
}
公共void添加(字符串prob、字符串reg、字符串数据、字符串用户)
{
字符串[]行={prob,reg,data,user};
ListViewItem项目=新建ListViewItem(行);
ListViewItem v=listView1.Items.Add(项目);
item.Checked=true;
}
问题很少
UI
thread)之外,不允许从其他线程更新控件,代码抛出跨线程
错误UI
thread)之外,不允许从其他线程更新控件,代码抛出跨线程
错误你放弃了开始线程
childThread.Start()
此外,您还将面临一个问题,其解决方案是,如果您直接在您放弃启动线程的UI线程上运行代码(无论如何都应该如此),会发生什么情况childThread.Start()
此外,您还将面临一个问题,其解决方案是,如果您直接在UI线程上运行代码(无论如何都应该如此),那么会发生什么情况?实际上,我正在读取一些注册表,但当我启动一个新线程时,值为vithin add();但是listview没有更新y。这种情况下,我也使用了您的代码,但存在相同的问题,并且使用了thread.start();我想,我知道发生了什么。可能控件的句柄还不存在,InvokeRequired会在控件的父链上搜索,直到找到具有窗口句柄的控件或窗体。如果找不到合适的句柄,InvokeRequired方法将返回false。检查invokererequired
是否返回false
是否编辑了代码我正在做的是在那里使用for循环请查看并帮助我这不是问题,请尝试放置Application.DoEvents()
启动线程后。实际上我正在读取一些注册表,但当我启动一个新线程时,该值来自vithin add();但是listview没有更新y。这种情况下,我也使用了您的代码,但存在相同的问题,并且使用了thread.start();我想,我知道发生了什么。可能控件的句柄还不存在,InvokeRequired会在控件的父链上搜索,直到找到具有窗口句柄的控件或窗体。如果找不到合适的句柄,InvokeRequired方法将返回false。检查invokererequired
是否返回false
是否编辑了代码我正在做的是在那里使用for循环请查看并帮助我这不是问题,请在启动线程后尝试放置Application.DoEvents()
。
public Form1()
{
InitializeComponent();
listView1.View = View.Details;
listView1.FullRowSelect = true;
listView1.Columns.Add("Problems", 80);
listView1.Columns.Add("Data", 120);
listView1.Columns.Add("Registry Key", 130);
listView1.Columns.Add("users", 80);
Thread childThread = new Thread(getlist);
childThread.Start();
}
public void getlist()
{
add("a", "b", "c", "d");
}
public void add(string prob, string reg, string data, string user)
{
String[] row = { prob, reg, data, user };
ListViewItem item = new ListViewItem(row);
if (listView1.InvokeRequired)
{
listView1.Invoke(new MethodInvoker(delegate
{
listView1.Items.Add(item);
item.Checked = true;
}));
}
else
{
listView1.Items.Add(item);
item.Checked = true;
}
}