【发布时间】:2020-11-23 12:04:21
【问题描述】:
我在对一组值进行排序时遇到问题。不管我使用什么类型的数组机制,在使用元组时我总是会收到诸如“对象引用未设置为对象的实例”之类的错误,或者在对字典进行排序时出现“值不能为空”。
有趣的是,我上面提到的错误只发生在我使用并行循环更快地处理数据时。当我不使用并行循环时,数据排序没有任何错误。
这是对字典进行排序的一行:
DictionaryValues = DictionaryValues.OrderBy(Function(x) x.Value).ToDictionary(Function(x) x.Key, Function(x) x.Value)
我也为此尝试了 Tuple,这是一个 Tuple 排序线:
lstToSort = lstToSort.OrderBy(Function(i) i.Item2).ToList
最后,这是我的“Parallel.For”代码块:
Dim ProcessedCTDataValues As New Dictionary(Of String, Double)
Dim t As Task = Task.Run(Sub()
Parallel.For(0, dv.Count - 1,
Sub(iii As Integer)
Dim cmprName As String = dv(iii)(0).ToString & "; " & dv(iii)(1).ToString & "; " & dv(iii)(2).ToString & "; " & dv(iii)(3).ToString
Dim cmprAddress As String = dv(iii)(2).ToString
If Not ProcessedCTDataValues.ContainsKey(cmprName) Then
Dim similarityName As Double = 0
Dim similarityAddress As Double = 0
similarityName += GetSimilarity.Invoke(InputKeyword.ToLower, cmprName.ToLower)
similarityAddress += GetSimilarity.Invoke(StreetNumber.Invoke.ToLower, cmprAddress.ToLower)
If cmprName.ToLower.Contains(InputKeyword.ToLower) Then similarityName += 1
If InputKeyword.ToLower.Contains(cmprName.ToLower) Then similarityName += 1
For Each word As String In InputKeyword.Split({" "c}, StringSplitOptions.RemoveEmptyEntries)
If cmprName.ToLower.Contains(word.ToLower) Then similarityName += 0.3
Next
ProcessedCTDataValues.Add(cmprName, similarityName + similarityAddress)
End If
End Sub)
End Sub)
t.Wait()
同样,如果我不使用并行循环,我可以毫无问题地对数据进行排序。但是如果我使用这个循环,我总是会出错。任何帮助将不胜感激!谢谢!
【问题讨论】:
标签: vb.net multithreading