添加listview子项的VB.net线程安全方法?
我试图以线程安全的方式将子项添加到listview 在单线程应用程序中,其工作原理如下:添加listview子项的VB.net线程安全方法?,vb.net,listview,thread-safety,Vb.net,Listview,Thread Safety,我试图以线程安全的方式将子项添加到listview 在单线程应用程序中,其工作原理如下: For i As Integer = 0 to lvMembers.Items.Count - 1 Dim lv As ListViewItem = lvMembers.Items(i) Dim str As String = lv.Text.ToString If str.Contains("value") lv.SubItems.Add("OK") lv.
For i As Integer = 0 to lvMembers.Items.Count - 1
Dim lv As ListViewItem = lvMembers.Items(i)
Dim str As String = lv.Text.ToString
If str.Contains("value")
lv.SubItems.Add("OK")
lv.SubItems(0).ForeColor = Color.Green
Else
lv.SubItems.Add("FAILED")
lv.SubItems(0).ForeColor = Color.Red
End If
Next
但是,如果在另一个线程中运行,则会导致跨线程错误
我已经看过使用Invoke的委托子项的示例,但是我看到的所有示例都涉及更新对象的text属性,我无法理解如何应用这个概念将子项实际添加到listview中
非常感谢您的帮助。一个简单的例子
Private delegate sub deladdtolist
Private sub addtolist
If InvokeRequired Then
del.Invoke( new deladdtolist(AddressOf addtolist))
else
For i As Integer = 0 to lvMembers.Items.Count - 1
Dim lv As ListViewItem = lvMembers.Items(i)
Dim str As String = lv.Text.ToString
If str.Contains("value")
lv.SubItems.Add("OK")
lv.SubItems(0).ForeColor = Color.Green
Else
lv.SubItems.Add("FAILED")
lv.SubItems(0).ForeColor = Color.Red
End If
Next
End If
End Sub
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
'sample data for the ListView
Dim ipsumA() As String = New String() {"Lorem", "ipsum", "dolor", "sit", _
"amet", "consectetur", "adipisicing", _
"elit", "sed", "do", "eiusmod", _
"tempor", "incididunt", "ut", "labore", _
"et", "dolore", "magna", "aliqua", "Ut", _
"enim", "ad", "minim", "veniam", "quis", _
"nostrud", "exercitation", "ullamco", _
"laboris", "nisi", "ut", "aliquip", "ex", _
"ea", "commodo", "consequat", "Duis", "aute", _
"irure", "dolor", "in", "reprehenderit", "in", _
"voluptate", "velit", "esse", "cillum", "dolore", _
"eu", "fugiat", "nulla", "pariatur", "Excepteur", _
"sint", "occaecat", "cupidatat", "non", "proident", _
"sunt", "in", "culpa", "qui", "officia", "deserunt", _
"mollit", "anim", "id", "est", "laborum"}
Dim lvi As New List(Of ListViewItem)
For Each s As String In ipsumA
Dim nLVI As New ListViewItem(s)
lvi.Add(nLVI)
Next
ListView1.Items.AddRange(lvi.ToArray)
'colorize from another thread
Dim t As New Threading.Thread(AddressOf thrd)
t.Start()
End Sub
Private Sub thrd()
If ListView1.InvokeRequired Then
ListView1.BeginInvoke(New MethodInvoker(AddressOf thrd))
Else
For i As Integer = 0 To ListView1.Items.Count - 1
Dim lv As ListViewItem = ListView1.Items(i)
Dim str As String = lv.Text.ToString
If str.ToLower.Contains("ut") Then
lv.SubItems.Add("OK")
lv.SubItems(0).ForeColor = Color.Green
Else
lv.SubItems.Add("FAILED")
lv.SubItems(0).ForeColor = Color.Red
End If
Next
End If
End Sub
End Class
这里有一个例子,我一遍又一遍地为自己使用。它支持传递变量。本例中的“我的列表”视图有1个项目和2个子项目(站点、组、pagerank),因此请修改它以供您自己使用: 代表:
Private Delegate Sub ListViewAddItem_delegate(ByVal name As String, ByVal group As String, ByVal pagerank As String)
Private Sub ListViewAddItem(ByVal name As String, ByVal group As String, ByVal pagerank As String)
If Me.ListView1.InvokeRequired Then
Dim d As New ListViewAddItem_delegate(AddressOf ListViewAddItem)
Me.ListView1.BeginInvoke(d, {name, group, pagerank})
Else
Dim lvi As New ListViewItem(name)
lvi.SubItems.Add(group)
lvi.SubItems.Add(pagerank)
ListView1.Items.AddRange(New ListViewItem() {lvi})
ListView1.Update()
End If
End Sub
如何称呼它:
Dim Name as string = "Test"
Dim Group As String = "TestGroup"
Dim PR As String = "10"
ListViewAddItem(Name, Group, PR)
我添加了“dim xxx as string”的内容,只是为了显示在调用ListViewAddItem()时名称组PR是字符串
我注意到没有选择答案。帮我们大家一个忙,选一个!谢谢 向ListView添加新ListViewItem的线程安全简化方法:
Private Sub AddListViewItem(ByVal name As String, ByVal subitem1 As String, ByVal subitem2 As String)
ListView1.BeginInvoke(Sub()
Dim lvi As New ListViewItem(name)
lvi.SubItems.Add(subitem1)
lvi.SubItems.Add(subitem2)
ListView1.Items.AddRange(New ListViewItem() {lvi})
End Sub)
End Sub
我看不出有什么问题。你能告诉我如何使用委托吗?我的问题是,如果我在主UI线程以外的任何地方运行它,它会抛出一个跨线程异常。如果在第二行失败,我想我必须改变我的整个方法,但不知道从哪里开始。