| 网站首页 | 业界新闻 | 群组 | 人才 | 技术文章 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 331 人关注过本帖
标题:敬请各位高手解决:vb.net2010如何判断所有多线程都已经运行完毕的问题?谢 ...
只看楼主 收藏
HVB6
Rank: 5Rank: 5
等 级:职业侠客
威 望:3
帖 子:261
专家分:367
注 册:2013-10-30
结帖率:100%
  问题点数:0  回复次数:4   
敬请各位高手解决:vb.net2010如何判断所有多线程都已经运行完毕的问题?谢谢
本人的一个vb.net2010程序经过测试已经正常,在此程序中,有几个过程中用到数目不等的多线程的方法,
这些多线程的运行有以下三个状况要判断(这是程序每次运行必须出现的状况之一):一、无一个多线程运行,
当几个过程运行结束时,程序结束,且用Msgbox函数通知:程序完毕。;二、不是所有的多线程运行,当几个过程和
多线程运行结束时,程序结束,且用Msgbox函数通知:程序完毕。;三、所有的多线程运行,当几个过程和多线程运行结
束时,程序结束,且用Msgbox函数通知:程序完毕。。
如上的情况,如何用代码解决。

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

2017-09-05 08:48
HVB6
Rank: 5Rank: 5
等 级:职业侠客
威 望:3
帖 子:261
专家分:367
注 册:2013-10-30
  得分:0 
补充:由于每次处理的问题的难度不一,程序运行完毕的时间也不一致,少则几秒,多则几分钟。
2017-09-05 09:02
HVB6
Rank: 5Rank: 5
等 级:职业侠客
威 望:3
帖 子:261
专家分:367
注 册:2013-10-30
  得分:0 
以下是微软的答复,太复杂。
https://msdn.microsoft.com/en-us/library/system.threading.thread(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1
2017-09-05 17:28
HVB6
Rank: 5Rank: 5
等 级:职业侠客
威 望:3
帖 子:261
专家分:367
注 册:2013-10-30
  得分:0 
微软的答复,本人认为只是说明如何运行多线程,没有说到如何判断所有的多线程已经全部运行完毕。
2017-09-06 16:17
不说也罢
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:39
帖 子:1480
专家分:4989
注 册:2007-10-7
  得分:0 
以下是引用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

附件: 您没有浏览附件的权限,请 登录注册
本帖最近评分记录
  • HVB6 积分 +7 好文章 2017-9-18 09:43

===================================================
讨厌C#的行尾的小尾巴;和一对大括号{ }
===================================================
2017-09-17 19:25







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.067535 second(s), 9 queries.
Copyright©2004-2017, BCCN.NET, All Rights Reserved