VB.NET多线程入门

VB.NET多线程入门,第1张

概述最近项目中遇到了一个处理速度慢堵塞用户界面 *** 作的问题,因此想用多线程来解决。 在处理数据的循环中,新建线程,在新建的线程中处理数据。多线程同时处理数据,以此来达到加速的目的,使用户界面 *** 作变得流畅。 在多任务 *** 作系统中,我们可以在 *** 作系统的协调下同时进行多个任务。各个任务以分时复用的形式来进行工作。Windows *** 作系统通过进程ID来管理各进程,每个进程至少包含一个线程,线程是进程中可以独立运行的

最近项目中遇到了一个处理速度慢堵塞用户界面 *** 作的问题,因此想用多线程来解决。

在处理数据的循环中,新建线程,在新建的线程中处理数据。多线程同时处理数据,以此来达到加速的目的,使用户界面 *** 作变得流畅。

在多任务 *** 作系统中,我们可以在 *** 作系统的协调下同时进行多个任务。各个任务以分时复用的形式来进行工作。windows *** 作系统通过进程ID来管理各进程,每个进程至少包含一个线程,线程是进程中可以独立运行的程序片段。在主程序运行时,主程序可以启动线程,线程与主程序同时运行。线程是系统中分时处理的最小单位,也就是说线程可以与主程序并行运行,参与同分时处理。线程有自己独立的栈处理数据,它在与主程序同时运行时可以共享主程序定义的变量、函数。只有当线程运行结束才把控制权还给主程序。

创建线程最直接的方法是创建新的线程类实例,并使用Address Of语句为运行的过程传递委托。但是这种方法不能传递参数和返回值。

我们可以通过将在单独的线程中运行的过程包装到类或结构中,为它们提供参数,并使之能返回参数。

下面是一个新建线程的小demo:

Class TasksClass    Public StrArg As String    Public RetVal As Boolean    Public resultFlag As Boolean    Public Event ResultEvent(ByVal resultFlag As Boolean)    Public Sub SoMetask()        ' 将 StrArg 字段用作参数。        MessageBox.show("StrArg 包含字符串" & StrArg)        RetVal = True ' 设置返回参数的返回值。    End SubEnd Class
Public Class Test    Private Sub Test_Load(sender As Object,e As EventArgs) Handles MyBase.Load        DoWork()    End Sub    ' 要使用类,请设置存储参数的属性或字段,    ' 然后,根据需要异步调用方法。    Sub DoWork()        Dim Tasks As New TasksClass()        Dim Thread1 As New System.Threading.Thread(AddressOf Tasks.soMetask)        Tasks.StrArg = "参数A" ' 设置用作参数的字段。        Thread1.Start() ' 启动新线程。        Thread1.Join() ' 等待线程 1 运行结束。        ' 显示返回值。        MessageBox.show("线程 1 返回值" & Tasks.RetVal)    End SubEnd Class

这样一个线程就被新建出来了。


但是事实上,创建过多的线程反而会影响性能,因为各个线程之间是分时复用的, *** 作系统需要在它们之间不断的切换,线程过多的时候,大量的时间消耗在线程切换上。

所以想只创建10个线程,剩余的数据等待这10个线程中的某个结束,再继续新建线程处理数据。使线程的总数一直保持在10个。

Public Class ThreadingObj    Public paper As WorkSpace    Public Sub ThreadingInsertPaper()        '多线程处理数据    End SubEnd ClassPrivate PaperList As List(Of WorkSpace) = New List(Of WorkSpace)Dim ThreadingList As List(Of System.Threading.Thread) = New List(Of System.Threading.Thread)
For Each paper In PaperList
    '多线程处理PaperList
    If ThreadingList.Count < 10 Then    '不到10个线程则继续新起线程        Dim ThreadingObject As New ThreadingObj        Dim ThreadingTask_1 As New System.Threading.Thread(AddressOf ThreadingObject.ThreadingInsertPaper)        ThreadingObject.paper = paper        ThreadingList.Add(ThreadingTask_1)        ThreadingTask_1.Start() ' 启动新线程。    Else        Dim goOnFlag As Boolean = False        '循环等待有线程结束        Do            If CheckThreadingStatus() Then                '存在已完成的线程                If ThreadingList.Count <= 10 Then                    Dim ThreadingObject As New ThreadingObj                    Dim ThreadingTask_1 As New System.Threading.Thread(AddressOf ThreadingObject.ThreadingInsertPaper)                    ThreadingObject.paper = paper                    ThreadingList.Add(ThreadingTask_1)                    ThreadingTask_1.Start() ' 启动新线程。                    goOnFlag = True                End If            Else                '所有线程都在进行中            End If        Loop Until goOnFlag = True    End If
Next
Function CheckThreadingStatus() As Boolean    '返回True表示存在已完成的线程    If ThreadingList.Count <= 10 Then        For Each ThreadingTaskItem In ThreadingList            'ThreadingTaskItem.IsAlive            If ThreadingTaskItem.IsAlive = False Then                ThreadingTaskItem.Abort()                ThreadingList.Remove(ThreadingTaskItem)                Return True            End If        Next    End If    Threading.Thread.Sleep(100)    If ThreadingList.Count <= 10 Then        For Each ThreadingTaskItem In ThreadingList            If ThreadingTaskItem.IsAlive = False Then                Return True            End If        Next    End If    Return FalseEnd Function
总结

以上是内存溢出为你收集整理的VB.NET多线程入门全部内容,希望文章能够帮你解决VB.NET多线程入门所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1268486.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存