线程问题;如何正确实施?

时间:2014-08-18 14:47:17

标签: .net vb.net multithreading performance splash-screen

我有一个程序,我在启动画面中有很多任务。显然我想尽可能快地完成它,我从网上找到的最好的解决方案就是做多线程。

问题是我不知道我是否正确实施它们,而且我感到困惑。我在网络上寻找一些网络摄像头,每个品牌都有不同的协议。所以每个品牌都有不同的课程。我想同时寻找多个品牌来加快速度:

 Public Shared workingCamList As New List(Of NetworkSearch.camera)  
 Public Shared Function findCameras(ByRef cameraList As List(Of NetworkSearch.camera)) As List(Of NetworkSearch.camera)

    workingCamList.Clear()

    Dim brand1Thread As New System.Threading.Thread(AddressOf FindFirstBrandCam)
    Dim brand2Thread As New System.Threading.Thread(AddressOf FindSecondBrandCam)


    brand1Thread .Start(workingCamList)
    brand2Thread .Start(workingCamList)

    'wait
    brand1Thread .Join()
    brand2Thread .Join()


    Return workingCamList
End Function

但是,不是先启动brand1,然后是品牌2而我只是等到他们都完成了,连接功能会一个接一个地等待。他们也将相机结构返回到相同的列表,所以我也试图防止竞争条件。我可以创建两个不同的列表并加入它们。

如何启动两个线程,然后等待它们完成?我也希望扩展到更多的线程。

1 个答案:

答案 0 :(得分:0)

从MSDN“Thread.Join()阻塞调用线程,直到线程终止,同时继续执行标准COM和SendMessage抽取。”

如果您希望两者同时运行并等待它们都完成,请为每个线程创建一个线程,您的线程函数都可以看到,在每个函数中确保将这些布尔值设置为“真的“一旦完成,然后循环直到这两个都是真的。

' somewhere FindFirstBrandCam and FindSecondBrandCam can access and your function can access
Dim finishedFindFirstBrandCam as Boolean = False
Dim finishedFindSecondBrandCam as Boolean = False


'in your function (partial code)
brand1Thread .Start(workingCamList)
brand2Thread .Start(workingCamList)

'instead of .join() for each thread
Do Until (finishedFindFirstBrandCam  And finishedFindSecondBrandCam )
    Application.DoEvents()
Loop

Return workingCamList

boolean方法适用于少量线程,要扩展到n个线程,你可以跟踪一个整数值,所有线程在完成时都会递增(确保使用Lock)(vb中的SyncLock) .net)http://msdn.microsoft.com/en-us/library/3a86s51t.aspx,否则你可能会有问题)。循环,直到整数值等于需要完成的线程数。