Vb.net BackgroundWorker,是否需要代理调用?
我一直在使用backgroundWorker和一个代理向listview添加listview项。我的代码将图像下载到imagelist,然后尝试将图像添加到listview。已添加第一个图像,但如果没有交叉线程错误,则无法将imagelist中的任何其他图像添加到listview。我不明白为什么第一个图像可以工作,但其他的都不行。通过在这个网站上查看这个主题,我意识到我必须使用InvokeRequired。我做错什么了吗?这是我的密码Vb.net BackgroundWorker,是否需要代理调用?,vb.net,listview,delegates,Vb.net,Listview,Delegates,我一直在使用backgroundWorker和一个代理向listview添加listview项。我的代码将图像下载到imagelist,然后尝试将图像添加到listview。已添加第一个图像,但如果没有交叉线程错误,则无法将imagelist中的任何其他图像添加到listview。我不明白为什么第一个图像可以工作,但其他的都不行。通过在这个网站上查看这个主题,我意识到我必须使用InvokeRequired。我做错什么了吗?这是我的密码 Dim strPhotoLink As St
Dim strPhotoLink As String = strPostContent.Substring(intPhotoLinkStartIndex + 35, ((intPhotoLinkEndIndex - intPhotoLinkStartIndex) - 29))
lstPhotoLinks.Add(strPhotoLink)
Try
ImageListPhotos.Images.Add(Bitmap.FromStream(System.Net.HttpWebRequest.Create(strPhotoLink).GetResponse.GetResponseStream))
Dim lvi As New ListViewItem("", ImageListPhotos.Images.Count - 1)
Dim delAddListViewPhotoItem As DelegateAddListViewPhotoItem = New DelegateAddListViewPhotoItem(AddressOf AddListViewPhotoItem)
delAddListViewPhotoItem.Invoke(lvi)
Catch ex As Exception
MessageBox.Show(ex.ToString)
End Try
Private Delegate Sub DelegateAddListViewPhotoItem(item As ListViewItem)
Private Sub AddListViewPhotoItem(item As ListViewItem)
If ListViewPhotos.InvokeRequired = True Then
Dim del As New DelegateAddListViewPhotoItem(AddressOf AddListViewPhotoItem)
ListViewPhotos.Invoke(del, item)
Else
ListViewPhotos.Items.Add(item)
End If
End Sub
第一段代码在哪里?如前所述,您可能正在一个线程上创建LVI,然后尝试将其添加到另一个线程中。我看不出哪里涉及到图像或图像列表(或者BGW),代码的第一部分在backgroundworker中运行。然后它调用委托添加listview项。我在错误的位置创建listview项?
代码在backgroundworker中运行
这是否意味着DoWork()
方法?是的,是“do work”方法。BGW的要点是在UI线程(创建它们的线程)以外的线程上执行一些耗时的任务。只能在UI线程上修改控件。因此,您的代码在ThreadA(例如)上创建LVI,然后尝试通过委托将其添加到UI线程上的LVI