Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用线程在listview中添加项目?_C#_.net_Multithreading_Winforms - Fatal编程技术网

C# 如何使用线程在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

我有一个简单的代码,但这是不工作如何解决这个问题线程正在运行,但listview没有更新是什么问题,有人可以解释一下吗

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