这是我正在尝试制作的同步网址下载程序的一部分。它将url列表保存在名为tbl
的数据表中,并绑定到名为dgvUrls
的datagridview。 Evrytime遇到一个死网址,它会从数据表中删除它。
我使用下面的代码重现了错误。 Button3_Click
向数据表添加100行,使其成为datagridview的数据源。 q()
删除第一行,一次删除一行。问题是datagridview没有反映数据表中所做的更改
Dim tbl = New DataTable
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
'Add 100 urls, for simplicity i'm adding only integers
tbl.Columns.Add("Urls")
For i = 1 To 100
tbl.Rows.Add(i)
Next
'bind to datagridview so that the end user can see the urls being download/removed from the list
dgvUrls.DataSource = tbl
'start multithread download , for simplicited (of this question) we have only one
Dim t As Thread = New Thread(AddressOf Download)
t.Start()
t.Join()
dgvUrls.Refresh()
End Sub
Private Sub download()
'for simplicity, the 1st 80 urls were dead!
For i = 1 To 80
'we remove the dead urls
tbl.Rows.RemoveAt(0)
Next
答案 0 :(得分:2)
一般来说,Refresh
DataGridView
是一件好事,主要是因为你正在从另一个线程执行修改;像这样的东西:
Dim t As Thread = New Thread(AddressOf q)
t.Start()
t.Join() 'Waits for the other thread to complete, such that the next line is reached on the right moment
dgvUrls.Refresh()
我删除了Dim ts As ThreadStart = New ThreadStart(AddressOf q)
,因为没有必要。此外,您不需要Sleep
和DoEvents
:
Private Sub q()
For i = 1 To 98
tbl.Rows.RemoveAt(0)
Next
End Sub
作为概念证明(了解所有这些是如何工作的)是可以的;但是在进一步研究之前,你应该检查逻辑中的各种想法:从DataSource
中删除这么多行会引发问题(你会发现它会触发错误);理想情况下,(至少,我更喜欢)你应该直接修改DataGridView
(如果可能的话)以避免信息同步问题;如果你处理多个线程,你将不得不设置一个“更合适的结构”(建议的t.Join()
应该被视为一个临时的修复工具)。