2013-06-03 6 views
0

пожалуйста, проверьте мой код ниже:случайное число в многопоточной не работает

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 

Теперь я понимаю, что дать и то, что я хочу. Предположим, я передать DataTable так:

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

Я не программист VB.net, но я подозреваю, что вы не устанавливая случайное число семян к чему-то, как текущее время в миллисекундах. В компьютерах нет таких вещей, как действительно случайные числа, поэтому вместо этого это математическая функция, которая дает последовательность несвязанных чисел, начиная с этого семени. Если вы не установите семя, то оно будет по умолчанию установленным числом, поэтому каждый раз вы получите одну и ту же последовательность. – sradforth

+0

Не забывайте, что случайный не является потокобезопасным. Поместите замок вокруг него. –

ответ

0

Случайный объект не является потокобезопасным. Вы можете обойти это, создав отдельные экземпляры случайного объекта в каждом потоке и используя идентификатор потока, чтобы генерировать семя .

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

+0

yup, который отлично поработал. :) большое спасибо – xhammer

Смежные вопросы