2012-04-03 192 views
0

确定这里是我的代码:多线程 - 添加更多的线程,并继续操作

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 = 0重新启动整个循环。

该程序下载一些网页,url从listbox2传递。 geturl会传递url并将其从列表中删除。所以当列表框为空时,退出for循环。

但上面的代码只运行了11次,并没有重新启动。我试着用标签和转到,但它简单的挂起。

有谁能告诉我该怎么办?

我想要的是保持10个线程继续下载网页,当列表为空时退出该功能。

回答

2

试图手动管理自己的自定义线程池可能是错误的方法。使用ThreadPool.QueueUserWorkItem或最好是新的Task类。线程池为您管理,极大地简化了代码。完全取消这段代码,重新开始使用我刚刚提到的技术之一。如果遇到实施上述任一技术的问题,请发布更具体的问题。

+0

好吧,我会检查出来。感谢让我知道回合:) – xhammer 2012-04-03 15:23:09

+0

@ xhammer:没问题,并再次发布另一个问题,如果你遇到这些新技术的麻烦。 – 2012-04-03 16:03:06

1

线程的微观管理是一个非常糟糕的主意。当我看到有人试图维护不断创建,终止和销毁的线程列表时,我只知道它们注定要失败。我看到有经验的专业人士试图做到这一点 - 看起来很有趣,等待几个月后试图解决不可修复的问题,不可避免的壮观失败。

线程池通常不是那种类型。它们通常是一组任务 - 生产者 - 消费者队列上的任务类实例 - 多个线程在可以自由工作时馈送。工作线程可以在完成旧任务时自行完成新任务 - 无需任何更高级的微管理。

收听@布莱恩 - 忘记管理线程列表,检查他们的状态和所有困难。它只会让你生病。使用ThreadPool.QUWI或任务。