多线程——在c#中更新列表视图

本文关键字:列表 视图 更新 多线程 | 更新日期: 2023-09-27 18:19:01

我试图在处理文本文件更新控件的windows窗体应用程序中更新我的listview。我的问题是交叉线程相关;每当我尝试更新控件时,就会出现错误。在我多线程应用程序之前没有任何错误,但是UI只有在处理完整个文本文件后才会更新。我希望UI在每行读取后更新。

我已经发布了相关的代码,希望有人能给我一些提示,因为我现在在墙上。错误发生在UpdateListView方法的if语句期间。请注意,PingServer方法是我编写的方法,与我的问题无关。

    private void rfshBtn_Click(object sender, EventArgs e)
    {
        string line;
        // Read the file and display it line by line.
        var file = new StreamReader("C:''Users''nnicolini''Documents''Crestron''Virtual Machine Servers''servers.txt");
        while ((line = file.ReadLine()) != null)
        {
            Tuple<string, string> response = PingServer(line);
            Thread updateThread = new Thread(() => { UpdateListView(line, response.Item1, response.Item2); });
            updateThread.Start();
            while (!updateThread.IsAlive) ;
            Thread.Sleep(1);
        }
        file.Close();
    }
    private void UpdateListView(string host, string tries, string stat)
    {
        if (!listView1.Items.ContainsKey(host)) //if server is not already in listview
        {
            var item = new ListViewItem(new[] { host, tries, stat });
            item.Name = host;
            listView1.Items.Add(item); //add it to the table
        }
        else //update the row
        {
            listView1.Items.Find(host, false).FirstOrDefault().SubItems[0].Text = host;
            listView1.Items.Find(host, false).FirstOrDefault().SubItems[1].Text = tries;
            listView1.Items.Find(host, false).FirstOrDefault().SubItems[2].Text = stat;
        }
    }

多线程——在c#中更新列表视图

Winform组件只能从主线程更新。如果你想从其他线程进行更新,更新代码应该在主线程上使用component.BeginInvoke()调用。

代替

 listView1.Items.Add(item);

你可以这样写:

listView1.BeginInvoke(() => listView1.Items.Add(item));

如果你的线程只做UI更新,没有其他资源密集型,那么不使用它是合理的,并从主线程调用UpdateListView作为方法。