2014-11-23 138 views
-1

在Visual Basic 2012(Vb.Net)編碼多線程 - 等待線程

我有一個應用程序,其中的程序,刪除文件,移動文件,提取文件等(這是一些什麼樣的安裝程序)

所以我很漂亮,在Vb.net上是「新手」,昨天我決定學習一些關於多線程的知識。

我繼續並添加了7個線程,該程序必須完成7個不同的任務。

當我完全完成後,我發現一個問題,線程正在同一時間完成他們的任務。

這在安裝程序中非常重要,它必須按照特定的順序執行所有文件的移動,刪除等操作。

我在MDSN和其他網站上看過如何讓一個線程等待另一個線程完成,然後再運行。

Thread1.Join()

我也嘗試了「加入」啄......但看起來它不僅使線程等待UI線程,而不是爲推出前一個線程。

所以...我沒有成功。有人可以幫我嗎?或者將我指向正確的方向。

小代碼示例:

Dim Thread1 As New System.Threading.Thread(AddressOf DeleteTemp) 
    Thread1.Start() 

    Dim Thread2 As New System.Threading.Thread(AddressOf CleanMods) 
    Thread2.Start() 
    Thread2.Join() 

    Dim Thread3 As New System.Threading.Thread(AddressOf MoveZip) 
    Thread3.Start() 
    Thread3.Join() 

    Dim Thread4 As New System.Threading.Thread(AddressOf MyExtract) 
    Thread4.Start() 
    Thread4.Join() 

    Dim Thread5 As New System.Threading.Thread(AddressOf CreateDirs) 
    Thread5.Start() 
    Thread5.Join() 

    Dim Thread6 As New System.Threading.Thread(AddressOf InstallMods) 
    Thread6.Start() 
    Thread6.Join()   

    Dim Thread7 As New System.Threading.Thread(AddressOf DeleteTemp) 
    Thread7.Start() 
    Thread7.Join() 

    Finish.StartPosition = FormStartPosition.CenterScreen 
    Finish.Show() 
    Me.Hide() 

BackgroundWorkder實施例:

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork 
    DeleteTemp() 
    CleanMods() 
    MoveZip() 
    MyExtract() 
    CreateDirs() 
    InstallMods() 
    DeleteTemp() 
End Sub 
+1

考慮使用TPL('任務'和'等待') – SLaks 2014-11-23 19:21:33

+1

共享一些代碼請..但一般來說,似乎你只需要一個線程,超越UI線程。如果涉及大量的IO,則需要'異步等待'+1。 – 2014-11-23 19:24:17

+0

我將使用一些代碼更新線程! – dimabal10000 2014-11-23 19:27:57

回答

0

以下是在C#中使用TPL一個簡單的例子。聲明一個數組來存儲任務,然後用Run()方法啓動每個任務。將任務數組傳遞給WaitAll(),或者在完成任務時使用WaitAny()處理每個任務。

Task[] theTasks = new Task[7]; 

theTasks[0] = Task.Run(() => Console.WriteLine("Do Stuff")); 

Task.WaitAll(theTasks); 

指向TPL文檔的鏈接。 http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspx

+0

我會馬上試試! – dimabal10000 2014-11-23 20:19:13

0

我這樣做:

Private Sub BackgroundWorker_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker.DoWork 

     DeleteTemp() 

     MoveZip() 

     MyExtract() 

    End Sub 

    Private Sub BackgroundWorker_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker.ProgressChanged 

    End Sub 

    Private Sub BackgroundWorker_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker.RunWorkerCompleted 
     CreateDirs() 

     CleanMods() 

     InstallMods() 

     DeleteTemp() 

     Finish.StartPosition = FormStartPosition.CenterScreen 
     Finish.Show() 
     Me.Hide() 
    End Sub 

所以基本上我感動的是由UI線程中使用的所有代碼到我RunWorkerCompleted ..這使我的UI線程凍結大約5 - 10秒.. 。但我不認爲這是一個大問題:)