将相同的变量传递给多个线程

时间:2013-01-09 05:44:51

标签: vb.net multithreading threadpool datarow

嗨,请检查此代码

For icnt As Integer = 1 To 100
        Me.SetText(icnt)
        Dim gd As String = ""
        Dim gl As String = ""
        Dim cr As String = ""
        Dim lr As String = ""
        Dim tbs As String = ""
        Dim srt As String = ""
        Dim fp As String = ""
        Dim ky As String = ""
        Dim prx As String = ""

        Dim rnd As New Random
        Dim scrpurl As String = ""
        Dim bldstr As New List(Of String)

        scrpurl = GlobalVariables.domain(rnd.Next(0, GlobalVariables.googledomain.Count - 1)) & "/search?q="
        scrpurl = scrpurl & GlobalVariables.prints(rnd.Next(0, GlobalVariables.footprints.Count - 1))
        scrpurl = scrpurl & GlobalVariables.words(rnd.Next(0, GlobalVariables.keywords.Count - 1))
        scrpurl = scrpurl & GlobalVariables.gl(rnd.Next(0, GlobalVariables.googlegl.Count - 1))
        scrpurl = scrpurl & GlobalVariables.cr(rnd.Next(0, GlobalVariables.googlecr.Count - 1))
        scrpurl = scrpurl & GlobalVariables.lr(rnd.Next(0, GlobalVariables.googlelr.Count - 1))
        scrpurl = scrpurl & GlobalVariables.tbs(rnd.Next(0, GlobalVariables.googletbs.Count - 1))
        scrpurl = scrpurl & GlobalVariables.start(rnd.Next(0, GlobalVariables.googlestart.Count - 1))

        MsgBox(scrpurl)

        bldstr.Clear()
        bldstr.Add(scrpurl)

        Dim dr3 As DataRow() = dtse.Select("seurl ='" & scrpurl & "'", "se")
        If (dr3.Count = 0) Then
            Dim w1 As WaitCallback = New WaitCallback(AddressOf setdata)
            ThreadPool.QueueUserWorkItem(w1, bldstr)
        End If

    Next

有人能告诉我,当我显示消息框时,我看到scrpurl和setdata的不同值会添加正确的行和100个唯一行。

当我不显示它时,setdata会添加100行相同的scrpurl。我知道应该做的事情,以便每个setdata得到不同的scrpurl但我在这里缺少一些东西。有人可以帮帮我吗?

此致

1 个答案:

答案 0 :(得分:1)

每次迭代循环时,您都在创建一个新的Random对象。如果将Dim rnd As New Random行移到for循环之前,它将正常工作。

这是因为计算机生成的随机数并不是随机的 - 它们只是出现是随机的。它的工作方式是首先确定“种子”值。然后,它使用数学公式,通过输入种子值加上附加序列值,可以获得下一个(看似)随机数。因此,只要种子值相同,它生成的随机数序列将始终相同。 Random类生成它的种子值的方式是基于创建对象时的当前时间。因此,如果您同时创建一堆Random个对象,它们将生成完全相同的随机数序列。

因此,在应用程序启动时创建一个Random对象通常是最佳做法,然后在每个地方重复使用相同的对象,而不是每次需要时都创建一个新对象。