注册 登录
编程论坛 VB.NET论坛

敬请各位高手解决:vb.net2010如何判断所有多线程都已经运行完毕的问题?谢谢

HVB6 发布于 2017-09-05 08:48, 7032 次点击
本人的一个程序经过测试已经正常,在此程序中,有几个过程中用到数目不等的多线程的方法,
这些多线程的运行有以下三个状况要判断(这是程序每次运行必须出现的状况之一):一、无一个多线程运行,
当几个过程运行结束时,程序结束,且用Msgbox函数通知:程序完毕。;二、不是所有的多线程运行,当几个过程和
多线程运行结束时,程序结束,且用Msgbox函数通知:程序完毕。;三、所有的多线程运行,当几个过程和多线程运行结
束时,程序结束,且用Msgbox函数通知:程序完毕。。
如上的情况,如何用代码解决。

[此贴子已经被作者于2017-9-5 08:52编辑过]

4 回复
#2
HVB62017-09-05 09:02
补充:由于每次处理的问题的难度不一,程序运行完毕的时间也不一致,少则几秒,多则几分钟。
#3
HVB62017-09-05 17:28
以下是微软的答复,太复杂。
https://msdn.(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1
#4
HVB62017-09-06 16:17
微软的答复,本人认为只是说明如何运行多线程,没有说到如何判断所有的多线程已经全部运行完毕。
#5
不说也罢2017-09-17 19:25
以下是引用HVB6在2017-9-6 16:17:50的发言:

微软的答复,本人认为只是说明如何运行多线程,没有说到如何判断所有的多线程已经全部运行完毕。

微软的example已经比较清晰了呀,ThreadPool提供了一个线程池,可以发送工作、处理异步、线程等待、线程记时,它的QueueUserWorkItem就是将方法排入队列,以便执行。
你可以建一个控制台应用程序,启动对象设为sub main:
程序代码:
Imports System.Diagnostics
Imports System.Threading
Module Example
    Public Delegate Sub ThreadStart()
    Public Sub Main()
        ThreadPool.QueueUserWorkItem(AddressOf ExecuteInForeground)
        Dim th1 As New Thread(AddressOf ExecuteInForeground)
        th1.Start()
        Dim th2 As New Thread(AddressOf ExecuteInForeground)
        th2.IsBackground = True
        th2.Start()
        Thread.Sleep(500)
        ThreadPool.QueueUserWorkItem(AddressOf WriteNumber)
        Dim th3 As New Thread(AddressOf WriteNumber)
        th3.IsBackground = True
        th3.Start()
        Thread.Sleep(500)
        ExecuteInForeground()
        'WriteNumber()
        MsgBox("所有线程都over了")
    End Sub

    Private Sub ExecuteInForeground()
        Dim start As DateTime = DateTime.Now
        Dim sw As Stopwatch = Stopwatch.StartNew()
        Console.WriteLine("Thread {0}: {1}, Priority {2}", _
                          Thread.CurrentThread.ManagedThreadId, _
                          Thread.CurrentThread.ThreadState, _
                          Thread.CurrentThread.Priority)
        Do
            Console.WriteLine("Thread {0}: Elapsed {1:N2} seconds", _
                              Thread.CurrentThread.ManagedThreadId, _
                              sw.ElapsedMilliseconds / 1000)
            Thread.Sleep(500)
        Loop While sw.ElapsedMilliseconds <= 5000
        sw.Stop()
    End Sub
    Private Sub WriteNumber()
        Dim i As Integer = 0
        Do
            i += 1
            Console.WriteLine(i.ToString)
        Loop While i <= 9000
    End Sub
End Module

只有本站会员才能查看附件,请 登录
1