【问题标题】:vb.net Sorting dictionary after Parallel loop并行循环后的vb.net排序字典
【发布时间】: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


    【解决方案1】:

    回答我自己的问题 - 这是一个非常具体的问题,可以通过使用 Concurrent dictionary 来解决。

    来自 Microsoft Docs:“表示可由多个线程同时访问的键/值对的线程安全集合。

    由于我使用的是 Parallel,因此这是一个值得期待的完美解决方案。

    在使用“Parallel.For”时,您可以创建一个并发字典,以与添加到常规字典相同的方式向其中添加项目,并以相同的方式使用它,而不是使用字典来添加键和值也是。

    要声明一个并发字典,你可以使用:

    Dim concDict As ConcurrentDictionary(Of String, Double) = New ConcurrentDictionary(Of String, Double)()
    

    要向其中添加项目,请使用:

    concDict.GetOrAdd(cmprName, similarityName + similarityAddress)
    

    并发字典是System.Collections.Concurrent Namespace的一部分

    干杯!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多