Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 多线程-添加更多线程并继续操作_Vb.net_Multithreading_For Loop - Fatal编程技术网

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:没问题,如果你在使用这些新技术时遇到麻烦,请再次发帖。