VB.NET多线程入门

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

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

在多任务操作系统中。我们能够在操作系统的协调下同一时候进行多个任务。各个任务以分时复用的形式来进行工作。

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 Sub
End 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 Sub
End Class

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

可是其实。创建过多的线程反而会影响性能。由于各个线程之间是分时复用的,操作系统须要在它们之间不断的切换。线程过多的时候,大量的时间消耗在线程切换上。

所以须要控制线程的数量。

如果我们仅仅新建10个线程,剩余的数据等待这10个线程中的某个结束,再继续新建线程处理数据。

使线程的总数一直保持在10个。

Public Class ThreadingObj
    Public paper As WorkSpace
    Public Sub ThreadingInsertPaper()
        ‘多线程处理数据
    End Sub
End Class
Private 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 False
End Function

如果操作系统中有50个活跃的线程。如果我们的程序仅仅有一个线程。那么程序就占用了系统资源的五十分之中的一个。如果此时再多开一个线程,那么就占用了系统资源的2/51。我们的程序占用的资源越多。处理速度也就会更快一些。

由于各个线程之间是分时复用的,所以活跃的线程数量也会影响程序的效率。

有一种说法是2N + 2个线程数。是最有效率的。N是CPU的核数。

可是这一说法也一直存在争议。

我的測试结果例如以下(我的电脑是i7 4770 。四核八线程):

线程数 1 2 3 4 5 6 7 8 9 10 11 15
耗时 753 409 345 316 305 286 280 282 273 273 264 266

測试的结果有点奇怪。。

。。

可能跟一些其它的因素也有关系。

比方DB的状态,比方浏览网页对CPU的占用

时间: 2024-08-29 10:49:16

VB.NET多线程入门的相关文章

[Python]多线程入门

Python的多线程有两种实现方法: 函数,线程类 1.函数 调用thread模块中的start_new_thread()函数来创建线程,以线程函数的形式告诉线程该做什么 # -*- coding: utf-8 -*- import thread def f(name): #定义线程函数 print "this is " + name if __name__ == '__main__': thread.start_new_thread(f, ("thread1",)

java多线程入门学习(一)

java多线程入门学习(一) 一.java多线程之前 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.     线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小.     线程和进程一样分为五个阶段:创建.就绪.运行.阻塞.终止.     多进程是指操作系统能同时运行多个任务(程序).     多线程是指在同一程序中有多个顺序流在执行. 在java中要想实现多线程,有两种手段,一种是继承T

VB.NET 基础入门

 VB.NET 基础入门 之前对VB 和C#语言有相应的了解,特别是VB,进行了很长一段时间的的深入的学 习,现在开始VB.NET 基础学习,学习进度不快,很多的东西要虚心向身边的高手学习. 交流.VB.NET开始有一段时间了,自己阶段是做一个VB.NET 的宏观学习把控! 一.什么是VB.NET ?  通俗的说,VB.NET 就是VB的最新版本,他对原版本进行了一些升级和增强.他是一 个完全面向对象的语言,VB .NET是同C#也是构建于.Net framework之上的.其最大的 优势就是他

C Linux 多线程入门

C Linux 多线程入门 ××× 入门示例 ????启动和停止直接使用接口即可,暂停和恢复需要自己定义,大体的代码如下: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <pthread.h> #include <unistd.h> #include <signal.h> #include <sys/time.h> struct si

(转载)Java多线程入门理解

转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 目录(?)[-] 一扩展javalangThread类 二实现javalan

C++面向对象多线程入门

第1节   背景 为了更好的理解多线程的概念,先对进程,线程的概念背景做一下简单介绍. 早期的计算机系统都只允许一个程序独占系统资源,一次只能执行一个程序.在大型机年代,计算能力是一种宝贵资源.对于资源拥有方来说,最好的生财之道自然是将同一资源同时租售给尽可能多的用户.最理想的情况是垄断全球计算市场.所以不难理解为何当年IBM预测“全球只要有4台计算机就够了”. 这种背景下,一个计算机能够支持多个程序并发执行的需求变得十分迫切.由此产生了进程的概念.进程在多数早期多任务操作系统中是执行工作的基本

c++标准库多线程入门

从c++ 11开始,语言核心和标准库开始引入了对多线程的原生支持.如下所示: int doSth(char c) { default_random_engine dre(c); uniform_int_distribution<int> id(10,10000); for(int i=0;i<10;i++) { this_thread::sleep_for(chrono::milliseconds(id(dre))); cout.put(c).flush(); } return c; }

【VB超简单入门】一、写在前面

每本书的前面总得写点什么,到我这里也自然不能免俗,前言这东西“存在即合理”,所以就随便写一点咯~ 首先这本书是给从未接触过编程的童鞋准备的,由于我学识疏浅,对VB也只是一知半解所以也只能讲一点点最基础的知识,入门之后便可以自由学习更高级的东西了~ 编程其实并不难,有很多人一看到屏幕上密密麻麻的代码就被吓呆了= =… 也有很多童鞋问我编程是不是得背很多代码= =…其实根本不用背,编程涉及的单词都是很简单的,高中的英语水平基本是可以胜任的,当然如果英语水平足够高的话可以直接阅读英文原版手册那就是更好

java中的多线程入门

本文主要是想学习下java中多线程的东西. 一.理解多线程. 多线程是怎么样的机制?他是允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此之间相互独立. 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,有操作系统负责调度,区别在于线程诶有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单. 多个线程的执行是并发的,也就是在逻辑上“同时”,而不管是否是物理上的“同时”,如果系统只有一个CPU,那么真正的“同时”是不可能的,但是由于CPU的速