数据行以错误或丢失的数据结束
Datarow ends up with wrong or lost data
我正在抓取 twitter 推文,我启动了多个后台工作者,他们执行以下操作:
For x as Integer = 0 to 5
Dim BGW As New BackgroundWorker
AddHandler BGW.DoWork, AddressOf TweetGrab
BGW.RunWorkerAsync(tweeturl)
Next
Public TemporaryRows As New List(Of DataRow)
Private Sub TweetGrab(tweeturl as String)
'some html stuff here
Dim ImageUrl as String = twitterImage.Attributes("src").Value
Dim ThumbnailUrl As String = ImageUrl & ":small"
Dim DataRowTemporary As DataRow = DataTable1.NewRow()
DataRowTemporary("ImageUrl") = ImageUrl
DataRowTemporary("ThumbnailUrl") = ThumbnailUrl
DataRowTemporary("Checked") = False
'I detect the error even here
TemporaryRows.Add(DataRowTemporary)
End Sub
稍后,我用 TemporaryRows 做一些事情。我遍历行并检查它们是否满足某些条件。
问题是 DataRowTemporary("Checked")
结束时是 DBNull 并且 DataRowTemporary("ThumbnailUrl")
与 ImageUrl
完全不同,即使我指定了 Dim ThumbnailUrl As String = ImageUrl & ":small"
这种情况发生在大约 2/10 的情况下。我猜它与后台线程有关,但我不知道如何解决它。我可以在错误发生后重新编辑字段,但我想首先防止错误发生。
问题是在其他线程(并行)访问集合时更改集合。
您不能并行执行 add/remove,必须锁定集合以避免出现奇怪的错误。
SyncLock TemporaryRows
TemporaryRows 'Add/Remove
End SyncLock
我正在抓取 twitter 推文,我启动了多个后台工作者,他们执行以下操作:
For x as Integer = 0 to 5
Dim BGW As New BackgroundWorker
AddHandler BGW.DoWork, AddressOf TweetGrab
BGW.RunWorkerAsync(tweeturl)
Next
Public TemporaryRows As New List(Of DataRow)
Private Sub TweetGrab(tweeturl as String)
'some html stuff here
Dim ImageUrl as String = twitterImage.Attributes("src").Value
Dim ThumbnailUrl As String = ImageUrl & ":small"
Dim DataRowTemporary As DataRow = DataTable1.NewRow()
DataRowTemporary("ImageUrl") = ImageUrl
DataRowTemporary("ThumbnailUrl") = ThumbnailUrl
DataRowTemporary("Checked") = False
'I detect the error even here
TemporaryRows.Add(DataRowTemporary)
End Sub
稍后,我用 TemporaryRows 做一些事情。我遍历行并检查它们是否满足某些条件。
问题是 DataRowTemporary("Checked")
结束时是 DBNull 并且 DataRowTemporary("ThumbnailUrl")
与 ImageUrl
完全不同,即使我指定了 Dim ThumbnailUrl As String = ImageUrl & ":small"
这种情况发生在大约 2/10 的情况下。我猜它与后台线程有关,但我不知道如何解决它。我可以在错误发生后重新编辑字段,但我想首先防止错误发生。
问题是在其他线程(并行)访问集合时更改集合。 您不能并行执行 add/remove,必须锁定集合以避免出现奇怪的错误。
SyncLock TemporaryRows
TemporaryRows 'Add/Remove
End SyncLock