多线程中的随机数不起作用

时间:2013-06-03 14:38:48

标签: vb.net visual-studio-2010 random datatable

请检查下面的代码:

Public Class tier1

Dim rnd As New System.Random()



Function build1(ByVal dt As DataTable) As String
    Try
        For i = 0 To 4
            For ix As Integer = 0 To till Step 4
                lstrn.Add(rnd.Next(ix, ix + 4))
            Next

            Dim cntx As Integer = 0

            For Each x As Integer In lstrn
                If (i = 0) Then
                    If (article(x).Split(ChrW(10)).Length > 2) Then
                        If (article(x).Split(ChrW(10))(0).Length > 300) Then
                            first.Add(article(x).Split(ChrW(10))(0))
                            cntx = cntx + 1
                            If (cntx = 25) Then
                                Exit For
                            End If
                        End If
                    End If
                End If


            lstrn.Clear()
        Next

        Dim fi as String = "{"

        For dx As Integer = 0 To first.Count - 2
            fi = fi & w.spinl(first(dx), "light") & "|"
        Next

        fi = fi & "}"

        Return fi
    Catch ex As Exception

    End Try

End Function

End Class

现在看我的主叫代码:

Dim w As WaitCallback = New WaitCallback(AddressOf beginscn)

For var As Integer = 1 To NumericUpDown1.Value
            Dim param(1) As Object
            param(0) = lst
            param(1) = var
            ThreadPool.QueueUserWorkItem(w, param)
        Next

sub 

sub beginscn()
    Dim scntxt As String = t1.buildtier1(dt)
end sub

现在明白我给的东西和我想要的东西。假设我传递了这样的数据表:

1,abcd,34,5
2,adfg,34,5
3,fhjrt,34,5
4,rtitk,34,5

我想要的是{abcd | adfg | fhjrt | rtitk},这个序列应该是随机的。由于我传递了50-100个值并且在25处退出循环,因此每个输出应该具有{|}格式的25个字符串的不同序列,但它不能像那样工作。每次我得到相同的序列。

任何人都可以解释为什么会这样做以及任何可能解决此问题的方法?

注意:我在排队之前已经尝试过改组数据,但它仍无效。

1 个答案:

答案 0 :(得分:0)

随机对象不是线程安全的。您可以通过在每个线程中创建随机对象的单独实例来解决此问题,并使用线程ID生成 种子。

http://msdn.microsoft.com/en-us/library/ms683183%28VS.85%29.aspx