多线程 - 等待线程

时间:2014-11-23 19:18:46

标签: vb.net windows multithreading

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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秒...但我不认为这是一个大问题:) / p>