Vb.net 多线程-添加更多线程并继续操作
好的,这是我的代码:Vb.net 多线程-添加更多线程并继续操作,vb.net,multithreading,for-loop,Vb.net,Multithreading,For Loop,好的,这是我的代码: For i = 0 To 10 Dim tTemp As Threading.Thread = New Threading.Thread(AddressOf dwnld) tTemp.IsBackground = True 'tTemp.Start(geturl) lThreads.Add(tTemp) 'MsgBox(lThreads.Item(i).ThreadState) N
For i = 0 To 10
Dim tTemp As Threading.Thread = New Threading.Thread(AddressOf dwnld)
tTemp.IsBackground = True
'tTemp.Start(geturl)
lThreads.Add(tTemp)
'MsgBox(lThreads.Item(i).ThreadState)
Next
我创建了一个包含10个线程的线程列表,为它们分配一个函数、属性并将它们添加到列表中
'While ListBox2.Items.Count > 0
For i = 0 To lThreads.Count - 1
If (lThreads.Item(i).ThreadState = 12) Then
If (ListBox2.Items.Count > 0) Then
lThreads.Item(i).Start(geturl)
If (i = lThreads.Count - 1) Then
i = 0
End If
Else
Exit For
End If
'MsgBox(lThreads.Item(i).ThreadState)
ElseIf (lThreads.Item(i).ThreadState = 16) Then
lThreads.RemoveAt(i)
Dim tTemp As Threading.Thread = New Threading.Thread(AddressOf dwnld)
tTemp.IsBackground = True
lThreads.Add(tTemp)
If (i = lThreads.Count - 1) Then
i = 0
End If
End If
Next
发生的事情是,我看到线程在函数dwnld完成后停止。所以我首先检查状态(12表示背景和未开始)。在案例12中,启动线程,在案例16(停止)中,移除该特定线程,并添加一个不同的线程,就像上面我添加的10一样
还有一个检查,当i计数器达到最后一个数字时,通过指定i=0重新启动整个循环
程序下载一些网页,url从listbox2传递。geturl将传递url并将其从列表中删除。因此,当列表框为空时,退出for循环
但是上面的代码只运行了11次,并且没有重新启动。我试着用一个标签和goto,但它只是挂起来
谁能告诉我该怎么办
我想要的是保持10个线程以继续下载网页,当列表为空时,退出该功能。尝试手动管理自己的自定义线程池可能是错误的方法。使用
ThreadPool.QueueUserWorkItem
或更喜欢使用新的任务
类。线程池是为您管理的,这大大简化了代码。完全废弃这段代码,使用我刚才提到的一种技术重新开始。如果在实现这两种技术时遇到问题,请提出更具体的问题。尝试手动管理自己的自定义线程池可能是错误的方法。使用ThreadPool.QueueUserWorkItem
或更喜欢使用新的任务
类。线程池是为您管理的,这大大简化了代码。完全废弃这段代码,使用我刚才提到的一种技术重新开始。如果您在实现这两种技术时遇到问题,请发布一个更具体的问题。线程的微观管理是一个非常糟糕的主意。当我看到有人试图维护一个不断创建、终止和销毁的线程列表时,我就知道它们注定要失败。我见过有经验的专业人士尝试这样做——看着很有趣,在几个月试图修复不可修复的问题之后,等待不可避免的巨大失败
线程池通常不是这样的。它们通常是一个任务池(生产者-消费者队列上的任务类实例),当多个线程可以自由工作时,这些任务池会提供一些线程。工作线程通过在完成旧任务后自己获取新任务来自动管理自己-不需要任何更高级别的微观管理
听@Brian-忘记管理线程列表,检查它们的状态和所有的问题。这只会让你生病。使用ThreadPool.QUWI或Tasks。线程的微观管理是一个非常糟糕的主意。当我看到有人试图维护一个不断创建、终止和销毁的线程列表时,我就知道它们注定要失败。我见过有经验的专业人士尝试这样做——看着很有趣,在几个月试图修复不可修复的问题之后,等待不可避免的巨大失败 线程池通常不是这样的。它们通常是一个任务池(生产者-消费者队列上的任务类实例),当多个线程可以自由工作时,这些任务池会提供一些线程。工作线程通过在完成旧任务后自己获取新任务来自动管理自己-不需要任何更高级别的微观管理
听@Brian-忘记管理线程列表,检查它们的状态和所有的问题。这只会让你生病。使用ThreadPool.QUWI或任务。好的,我会检查它们。谢谢你让我知道这件事:)@xhammer:没问题,如果你在使用这些新技术时遇到麻烦,请再发一个问题。好的,我会检查一下。谢谢你让我知道这件事:)@xhammer:没问题,如果你在使用这些新技术时遇到麻烦,请再次发帖。