线程:BeginInvoke如何添加一个完整的ListviewItem?

时间:2011-06-05 10:22:04

标签: c# winforms multithreading listviewitem

如何通过BeginInvoke添加listview子项 - > myDelegate进程? 我尝试了各种版本的解决方案,但总是有错误的!

非常感谢你的帮助!

    public delegate ListViewItem myDelegate(string  aItem);    
...
        if (InvokeRequired)
            {
            ListViewItem lvwItem = new ListViewItem();
            lvwItem.Text = strMessage;
            lvwItem.SubItems.Add(".2.");
            BeginInvoke(new myDelegate(listView1.Items.Add), new string[] { strMessage }); //works with a var of type string, but not for more Subitems.add()

            }

我找到了答案,但我不能将其作为答案发布,因为我必须等待7个小时....

我发现解决方案没有崩溃我的多线程应用程序......我很愚蠢;)

在我的委托中,我使用了String而不是Listviewitem!

      public delegate ListViewItem myDelegate2(ListViewItem  aItem);
...
                                  if (InvokeRequired)
                                    {
                                        //BeginInvoke(new myDelegate(listView1.Items.Add), new object[] { strMessage });
                                        ListViewItem lvwItem = new ListViewItem();
                                        lvwItem.Text = strMessage;
                                        lvwItem.SubItems.Add(".2.");
                                        BeginInvoke(new myDelegate2(listView1.Items.Add), new object[] { lvwItem });
}

1 个答案:

答案 0 :(得分:4)

你似乎变得相当束缚。试试这个:

ListViewItem lvwItem = new ListViewItem();
lvwItem.Text = strMessage;
lvwItem.SubItems.Add(".2.");
if (listView1.InvokeRequired)
    listView1.BeginInvoke(new MethodInvoker(() => listView1.Items.Add(lvwItem)));
else
    listView1.Items.Add(lvwItem);