Vb.net ParallelOptions.MaxDegreeOfParallelism设置为-1

Vb.net ParallelOptions.MaxDegreeOfParallelism设置为-1,vb.net,parallel.foreach,Vb.net,Parallel.foreach,请参阅下面的代码: Private Shared ReadOnly log As ILog = LogManager.GetLogger(GetType(ScheduledTasks)) Private Shared TestString As String = "" Public Shared Sub writeConsole(ByVal i As Integer) System.Threading.Thread.Sleep(1000) TestString = TestS

请参阅下面的代码:

Private Shared ReadOnly log As ILog = LogManager.GetLogger(GetType(ScheduledTasks))

Private Shared TestString As String = ""

Public Shared Sub writeConsole(ByVal i As Integer)
    System.Threading.Thread.Sleep(1000)
    TestString = TestString & i
End Sub

Public Shared Sub ParallelTest()

    Dim int1 As Integer = 1, int2 As Integer = 2, int3 As Integer = 3, int4 As Integer = 4, int5 As Integer = 5, int6 As Integer = 6, int7 As Integer = 7, int8 As Integer = 8, int9 As Integer = 9, int10 As Integer = 10
    Dim list As List(Of Integer) = New List(Of Integer)
    list.Add(int1)
    list.Add(int2)
    list.Add(int3)
    list.Add(int4)
    list.Add(int5)
    list.Add(int6)
    list.Add(int7)
    list.Add(int8)
    list.Add(int9)
    list.Add(int10)

    Dim ParallelOptions As ParallelOptions = New ParallelOptions
    ParallelOptions.MaxDegreeOfParallelism = 1 ' Environment.ProcessorCount * 10
    Parallel.ForEach(Of Integer)(list.AsEnumerable(),
                               Sub(test As Integer)
                                   writeConsole(test)
                               End Sub)
    MsgBox("got here")

当代码到达消息框时,TestString包含以下值:16237594810。我希望是:12345678910。这似乎表明正在使用多个线程,即使MaxDegreeOfParallelism设置为:1。这是为什么?

您确定它设置为1吗
MaxDegreeOfParallelism=-1
:如果它是-1,则对并发运行的操作数没有限制。@programmer,它肯定设置为1。好的,所以我刚刚用您提供的代码进行了一些测试,似乎当您在线程上调用
Sleep
时,它会选择一个新线程。将writeConsole参数替换为string,并将对该参数的调用替换为
writeConsole(test&“-”&Threading.Thread.CurrentThread.ManagedThreadId&vbCrLf)
,这样您就可以看到每个数字对应的线程ID。修改最大值时,它似乎实际上没有改变,但它显示了睡眠时线程ID的变化。您确定它设置为1吗
MaxDegreeOfParallelism=-1
:如果它是-1,则对并发运行的操作数没有限制。@programmer,它肯定设置为1。好的,所以我刚刚用您提供的代码进行了一些测试,似乎当您在线程上调用
Sleep
时,它会选择一个新线程。用string替换writeConsole参数,并用
writeConsole(test&“-”&Threading.Thread.CurrentThread.ManagedThreadId&vbCrLf)
替换对该参数的调用,这样您就可以看到每个数字的线程ID。修改max值时,该参数似乎没有实际更改,但它显示了睡眠时线程ID的更改