在你的VB.NET应用程序中使用多线程

基于VB.NET多线程编程实现 基于VB.NET多线程编程实现  摘 要 Visaul Basic 在6.0之前的版本中对多线程并没有提供一个很好的支持,而微软的.NET框架提供了新的类库,从而可以方便地创建多线程应用程序。 本文首先概述了进程、线程以及应用程序域的相互关系,随后介绍了如何使用Visual Basic.NET多线程编程技术来开发效率更高,响应速度更快的应用程序。   关键词 .NET框架 Visual Bas 阅读详情

在你的VB.NET应用程序中使用多线程

   很长时间以来,开发人员一直要求微软为VB增加更多的线程功能——这一点在VB.NET中终于实现了。VB6不支持创建多线程的EXEDLL以及OCX。但这种措词容易引起误解,这是因为VB6支持执行多个单线程的单元。一个单元实际上是代码执行的场所而且单元的边界限制了外部代码对单元内部的访问。

   VB.NET支持创建自由线程的应用程序。这意味着多个线程可以访问同一个共享的数据集。本文将带领你了解多线程的基本内容。

虽然VB支持多个单线程的单元,但并不支持允许多个线程在同一个数据集上运行的自由线程模型。在很多情况下,产生一个运行后台处理程序的新线程会提高应用程序的可用性。一种很显然的情况就是当执行一个可能使窗体看起来停止响应的长过程时,你一定会想在窗体上放置一个取消按钮。

解决方法

由于VB.NET使用公共语言运行时(Common Language Runtime),它增强了很多新的特性,其中之一便是创建自由线程应用程序的能力。

VB.NET中,开始使利用线程进行工作是很容易的。稍后我们会探究一些精妙之处,我们先创建一个简单的窗体,它生成一个执行后台处理程序的新线程。我们需要做的第一件事是将要在新线程上运行的后台处理程序。下面的代码执行一个相当长的运行过程——一个无限循环:

Private Sub BackgroundProcess()

    Dim i As Integer = 1

    Do While True

        ListBox1.Items.Add("Iterations: " + i)

        i += 1

    Loop

End Sub

这段代码无限地循环并在每次循环中向窗体上的列表框中增加一个条目。如果你对VB.NET不熟悉的话,便会发现这段代码中有一些在VB6中无法完成的事:

l          在声明变量时对其赋值 Dim i As Integer=1

l          使用+=操作符 i+=1代替了i=i+1

l          Call关键字已经被去除了

一旦我们有了一个工作过程,便需要将这段代码指派给一个新的线程并开始它的执行。完成这项工作,我们需要使用Thread对象,它是.NET框架类中System.Threading命名空间的一部分。当实例化了一个新的Thread类时,我们向其传递一个引用,这个引用指向我们想要在Thread类的构造函数中执行的代码块。下面的代码创建一个新的Thread对象并将指向BackgroundProcess的引用传递给它:

Dim t As Thread

t = New Thread(AddressOf Me.BackgroundProcess)

t.Start()

AddressOf操作符为BackgroundProcess方法创建了一个委派对象。委派在VB.NET中是一种类型安全的、面向对象的函数指针。在线程被实例化之后,你可以通过调用线程的Start()方法开始执行代码。

使线程处于控制之下

当线程开始之后,你可以通过使用Thread对象的方法对其状态进行一定的控制。你可以通过调用Thread.Sleep方法暂停线程的执行。这个方法接收一个表示线程将要休眠多长时间的整型数值。如果在上例中你想要减缓列表框条目的添加,在代码中放置一个对此方法的调用:

Private Sub BackgroundProcess()

    Dim i As Integer = 1

    Do While True

        ListBox1.Items.Add("Iterations: " + i)

        i += 1

        Thread.CurrentThread.Sleep(2000)

    Loop

End Sub

CurrentThread是一个公共静态属性,它可以使你获取一个对当前运行线程的引用。

你还可以通过调用Thread.Sleep (System.Threading.Timeout.Infinite)使一个线程处于一种时间不确定的休眠状态。要中断这种休眠,可以调用Thread.Interrupt 方法。

类似与SleepInterrupt的是SuspendResumeSuspend允许你阻塞一个线程直到另外的线程调用Thread.ResumeSleepSuspend之间的区别在于后者不是立即使一个线程处于等待状态。在.NET运行时确定线程是处于一个安全的挂起位置之前,线程是不会挂起的。Sleep则是立即使线程进入等待状态。

最后,Thread.Abort中止一个线程的执行。在我们的简单例子中,我们还想增加另外一个可以使我们中止程序的按钮。要完成这些,我们所需做的一切便是如下面这样调用Thread.Abort方法:

Private Sub Button2_Click(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles Button2.Click

    t.Abort()

End Sub

在此便可以看出多线程的能力。用户界面看起来对用户是有响应的,因为它运行在一个线程中而后台的处理程序运行在另一个线程中。取消按钮会立即响应用户的click事件同时处理过程被中止。

通过多线程的过程传递数据

上一个例子展示了一种相当简单的情况。在你编程的时候,多线程有很多需要解决的复杂问题。你将会遇到的一个问题是向传递给Thread类构造函数的过程传递数据以及从这个过程传出数据。换言之,你想要在另一个线程上开始的过程不能接收任何参数而且你也不能从这个过程返回任何数据。这是因为传递给线程构造函数的过程不能有任何参数或返回值。为了避开这个问题,将你的过程包装到一个类中,在这个类中此方法的参数被表示成类的一个域。

有一个简单的例子,如果我们有一个计算一个数的平方的过程:

Function Square(ByVal Value As Double) As Double

    Return Value * Value

End Function

为了使这个过程可以在一个新线程中使用,我们将其包装到一个类中:

Public Class SquareClass

    Public Value As Double

    Public Square As Double

    Public Sub CalcSquare()

        Square = Value * Value

    End Sub

End Class

使用这些代码在一个新线程中启动CalcSquare过程,代码如下:

Private Sub Button1_Click(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles Button1.Click

    Dim oSquare As New SquareClass()

    t = New Thread(AddressOf oSquare.CalcSquare)

    oSquare.Value = 30

    t.Start()

End Sub

注意当线程开始后,我们没有检查类的平方值,因为并不能保证一旦你调用线程Start方法,它便会执行。有一些方法可以从另外的线程中获取这个值。最简单的方法是当线程完成时引发一个事件。我们会在下一个部分线程同步中讨论另外一种方法。下面的代码为SquareClass增加了事件声明。

Public Class SquareClass

    Public Value As Double

    Public Square As Double

    Public Event ThreadComplete(ByVal Square As Double)

    Public Sub CalcSquare()

        Square = Value * Value

        RaiseEvent ThreadComplete(Square)

    End Sub

End Class

在调用代码中捕获这个事件与VB6相比没有太大的变化,仍然是用WithEvents声明变量并在一个过程中处理事件。变化的部分是用Handles关键字声明处理事件的过程并且不再使用像VB6Object_Event的命名约定。

Dim WithEvents oSquare As SquareClass

 

Private Sub Button1_Click(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles Button1.Click

    oSquare = New SquareClass()

    t = New Thread(AddressOf oSquare.CalcSquare)

    oSquare.Value = 30

    t.Start()

End Sub

 

Sub SquareEventHandler(ByVal Square As Double) _

        Handles oSquare.ThreadComplete

    MsgBox("The square is " & Square)

End Sub

这个方法需要注意的一个问题是处理事件的过程,在本例中是SquareEventHandler,将运行在引发事件的线程中,而不是运行在窗体从中执行的线程中。

线程同步

VB.NET包含了一些语句用于提供线程的同步。在Square的例子中,你可能想同步执行计算的线程以便等到计算完成,这样便可以获得结果。举另外一个例子,如果你在一个单独的线程中对数组进行排序并且在使用这个数组之前要等待这个处理过程结束。为了实现这些同步,VB.NET提供了SyncLock语句和Thread.Join方法。

SyncLock获取了对传递给它的对象引用的独占性锁。通过取得这种独占锁,你可以确保多个线程不会访问共享的数据或是在多个线程上执行代码。一个可以方便地用于获取锁地对象是关联于每个类的System.Type对象。可以通过GetType方法获得System.Type对象:

Public Sub CalcSquare()

    SyncLock GetType(SquareClass)

        Square = Value * Value

    End SyncLock

End Sub

最后,Thread.Join方法允许你等待一段特定的时间直到一个线程结束。如果线程在你所确定的时间之前完成,Thread.Join返回True,否则的话返回False。在Square的例子中,如果我们不想引发事件,可以调用Thread.Join方法来确定计算是否已经结束。代码如下所示:

Private Sub Button1_Click(ByVal sender As System.Object, _

        ByVal e As System.EventArgs) Handles Button1.Click

    Dim oSquare As New SquareClass()

    t = New Thread(AddressOf oSquare.CalcSquare)

    oSquare.Value = 30

    t.Start()

    If t.Join(500) Then

        MsgBox(oSquare.Square)

    End If

End Sub

 

作者:Matthew Arnheiter是位于哈肯萨克市(Hackensack)GoAmerica Communications公司的一名资深顾问,他还是The Visual Basic Developer's Guide to Design Patterns and UML (Sybex, 2000)一书的作者。可以通过(201)996-1717 x2367Marnheitergoamerica.net与他取得联系。

VB.NET 从入门到精通:开启编程进阶之路 VB.NET作为一种功能强大且易于上手的编程语言,在 Windows 应用程序开发、Web 应用开发以及与其他技术集成等方面都有着广泛的应用。从基础的语法学习到面向对象编程、图形用户界面设计、数据访问、异常处理、多线程编程以及与 Windows API 和 Web 服务的交互,再到应用程序的部署,每一个环节都是构建高质量VB.NET应用程序的关键。通过深入学习和实践这些内容,开发者能够逐步掌握VB.NET的精髓,开发出功能完备、性能优良、用户体验良好的应用程序 阅读详情

相关推荐

vb.net多线程Thread-搜索局域网的计算机(源代码)

VB.Net程序设计:多进程处理。 最近要用到多进程程序,来处理一些数据。 在网上找了许多文章。现在会用多线程处理数据了,感觉程序灵活性增强了。VB.Net-C#多线程Thread-代理委托delegate编程(参考网络上的小部分代码):搜索局域网的计算机例子 程序和界面说明: http://blog.csdn.net/linjimu/archive/2009/01/ 06/3721803.aspx

[VB.NET]多线程——创建新线程

创建线程最直接的方法是创建新的线程类实例,并使用 AddressOf 语句为要运行的过程传递委托。例如,以下代码将名为 SomeTask 的子过程作为单独的线程运行。 Dim Thread1 As New System.Threading.Thread(AddressOf SomeTask)Thread1.Start 此处的代码立即运行。以上所述就是创建和启动线程的方法。在线程 Start

VB.NET学习网-VB.NET实例、VB.NET教程、VB.NET源码下载 1779

VB.NET 多线程开发速成教程(附实例)

过去,我们利用VB开发多线程应用程序时,是一件很令人痛苦的事,经常是多线程的程序运行是会变成多错误的程序!但在VB.NET中,这种状况已经大为改观。现在,我们利用VB.NET处理多线程和利用JAVA处理多线程一样简单了。下面我们就举个例子,来看看VB.NET多线程吧! 对于初次接触多线程的人,很适合的入门教程。

VB.NET向Word VBA传递参数,并调用Word VBA生成Word报告或PDF文档

之前我们看到用VB.NET调用Excel VBA的例子比较多,本次是使用VB.NET向Word VBA传递参数,并调用Word VBA生成Word报告或PDF文档。 在Word VBA中,可访问数据库,获得自己想展示的数据,灵活度比较高。 运行环境:VS2017 Word2016

VB.NET多线程技术及其实现【转载】

摘 要: Visaul Basic 在6.0之前的版本中对多线程并没有提供一个很好的支持,而微软的.NET框架提供了新的类库,从而可以方便地创建多线程应用程序。本文首先概述了进程、线程以及应用程序域的相互关系,随后介绍了如何使用Visual Basic.NET多线程编程技术来开发效率更高,响应速度更快的应用程序。   关键词 .NET框架 Visual Basic.NET 多线程 同步 ...

weixin_30482181的博客 623

[NET]在你的VB.NET应用程序使用多线程

在你的VB.NET应用程序使用多线程     在你的VB.NET应用程序使用多线程

王德封-逐浪 3706

VB.NET应用程序多线程的应用实例

很长时间以来,开发人员一直要求微软为VB增加更多的线程功能——这一点在VB.NET中终于实现了。VB6不支持创建VB.NET多线程的EXE、DLL以及OCX。但这种措词容易引起误解,这是因为VB6支持执行多个单线程的单元。一个单元实际上是代码执行的场所而且单元的边界限制了外部代码对单元内部的访问。 VB.NET支持创建自由线程的应用程序。这意味着多个线程可以访问同一个共享的数据集。本文将带领你了

MinSen 5690

在你的VB.NET应用程序使用多线程 (转)

在你的VB.NET应用程序使用多线程 (转)[@more@]在你的vb.NET应用程序使用多线程 很长时间以来,开发人员一直要求微软为VB增加更多的线程功能——这一点在VB.NET中终于实现了。vb6不支持创建多线程...

ciya3282的博客 355

如何创建带参数多线程程序

这是用VB.net演示的一个演示多线程的程序,可以给初学VB.net的线程的同志做个很好的例子参考。

VB.NET使用多线程

这是一个简单的VB.NET使用托管的多线程程序。防止界面假死。教你怎么使用Delegate来传递参数。 代码简单。 抛砖引玉。谢谢!

vb.net中委托的例子

vb.net编写的一个关于如何声明、调用委托的一个小例子

vb.net 最简单的理解委托

初学.net委托迷糊人的朋友,看看俺超精简的代码能不能帮到你,代码中有部分注解能够快速引导你去理解委托,弄明白了告诉俺一声,一起高兴高兴,嘿嘿!

VB.NET视频总结(三)

前两篇文章跟大家一起走过了总结篇一、二,现在终于到了终结篇三,有没有一种突然轻松了的感觉?伴随着知识的不断积累,对前面的模糊点渐渐的也有了更多的理解。学习就是这么一个在反复中前进的过程。好了,我们马上看看从最后五章得到了哪些收获吧。 第十一章   以元件为基础的设计 前面总结中已经涉及过元件这个概念,元件在VB.NET中称作组件,它作为VB.NET的基础,我们就以知道它的重要性

思想上移,行动下移 1272

VBVB.NET——VB6程序员如何转向.NET

(发表于《CSDN开发高手》2003年9月号)作者 Mahesh Chand翻译 韩磊 Visual Basic .NET是Microsoft Visual Studio .NET套件中主要组成部分之一。.NET版本的Visual Basic增加了更多特性,而且演化为完全面向对象(就像C++)的编程语言。本文将介绍VB.NET的新特性,并比较VB6.0/VB.NET之间的区别,阐述

2944

VB.Net多线程及委托

VB.Net多线程及委托   一、多线程:在一个程序中,这些独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。多线程处理一个常见的例子就是用户界面。利用线程,用户可按下一个按钮,然后程序会立即作出响应,而不是让用户等待程序完成了当前任务以后才开始响应。用多线程的目的就是提高应用程序对事务处理能力,当

Goldxwang的博客 7127
上一篇: Visual Basic.NET 中的语言新变化
下一篇: 提升JAVA程序的性能
mashy
博客等级 码龄26年 0粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值