2016-09-26 58 views
0

我不得不在vb中编写一个可以在simultaniusly目录中处理文件的多线程程序。 问题是,它运行良好几个小时。然后它突然在“Thread.Sleep(500)”中找到,因为所有3个线程都是Alive方法返回“true”值,但是“StartSub”在所有线程中结束......并且似乎没有终止。我的代码错了,或者可能是什么问题?有时线程在代码结束后仍然活着

Basicaly的程序是这样的:

private sub main() 
    importThread = New Thread(AddressOf StartSub) 
    importThread2 = New Thread(AddressOf StartSub) 

    for each file in directory 
       While True 
        If importThread.IsAlive And importThread2.IsAlive Then 
         Thread.Sleep(500) 
        Else : Exit While 
        End If 
       End While 

       If importThread.IsAlive Then 
        importThread2 = New Thread(AddressOf StartSub) 
        importThread2.IsBackground = True 
        importThread2.Start() 
       Else 
        importThread = New Thread(AddressOf StartSub) 
        importThread.IsBackground = True 
        importThread.Start() 
       End If 
    next 
End sub 

Private Sub StartSub(ByVal tp As Object) 
     'Read fileinfo and process it for something 
end Sub 
+0

您为每个目录开始2个新线程。我建议你使用Tasks和TPL,而不是尝试使用原始线程。这将允许你使用正确的方法,而不是线程和对象,结合任务与'await'和'ContinuteWith'等。你也可以使用'Parallel.ForEach'并行处理每个文件夹 –

+0

谢谢,但我在寻找我的代码/思想中的问题。为什么两个线程在其方法进程已经完成时仍然活着,为什么它会在几个小时内工作?理解这个问题可以帮助我在多线程中变得更好...... – user3219009

+0

首先,如何知道何时不将代码发布到'StartSub'?虽然有一些明显的问题,比如为每个文件夹启动两个线程,但只检查* last *迭代中创建的那些线程。即使你没有生成虚拟线程,你的代码也会一直等待其中一个StartSub方法完成。如果没有,循环将不会完成。 –

回答

0

看来,线程处理还是不错的,垃圾收集点采取由终止线程离开线程资源。程序停滞是因为线程从Form控件恢复了信息,有时甚至在调用时窗体上的控件都没有响应。这使得线程挂断。

相关问题