VB.Net的多线程及委托

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

1、定义:线程定义比较简单

DimTdAsSystem.Threading.Thread

2、实例化

Td=NewSystem.Threading.Thread(AddressOf过程名)

3、执行

Td.Start()

下面看一段代码:

System.Threading.Thread'定义一个线程

DimTd=abc)

Subabc()

DimnasInt32=0

Forn=0To100000000

System.Threading.Thread.Sleep(10)让它走慢一点

Next

EndSub

PrivateSubButton1_Click(ByValsenderSystem.Object,eSystem.EventArgs)HandlesButton1.Click

abc)'实例化,指向abc过程

Td.Start()开始运行线程

EndSub

上面的代码就是一个简单的线程实例,这里有几个关于线程的命令,列举下面

命令含义

Start引起线程开始运行

Sleep暂停线程一段时间。格式:Thread.Sleep(毫秒数)

Suspend线程到达安全点时暂停线程

Abort停止线程

Resume重新启动暂停的线程

Join引起当前线程等待另一个线珵结果

上面的大多简单易懂,但是安全点(safepoint)的概念对你来说可能是新的。安全点是代码中的某个位置,在这个位置通用语言运行时可以安全地执行自动无用单元收集(garbagecollection,释放无用变量并恢复内存的过程)。当调用线程的AbortSuspend方法时,通用语言运行时分析代码,决定线程停止运行的适当位置。

下表是线程常用属性:

属性值

IsAlive如果线程是活动的,值为True

IsBackgroud获取或设置一个布尔值,表示某个线程是否允许是后台线程

Name获取或设置线程的名称

Priority获取或设置一个操作系统用于区分线程调用的优先级

ApartmentState获取或设置特定线程使用的线程模型

ThreadState包含描述线程状态的值

二、委托

在上面的实例中,在过程abc中添加一条语句:

TextBox1.Text=n.ToString

就会出现一条错误信息:“线程间操作无效:从不是创建控件“TextBox1”的线程访问它。”

这种错误解决方法在MSDN上提到三种,我们常用的是二种,没到MSDN上的第三种看过,我们只说前二种:

1、是在构造函数或者窗体Load的代码里添加下面一句:

Control.CheckForIllegalCrossThreadCalls=False

这种不是用委托。

很简单,如果你是一个线程对某一控件操作,这种方法没问题,如果是多个线程对一个控件操作,这可能造成假死,窗体无反应,就是死锁现象。我们强烈建议你用委托。

2、委托(Delegate

委托的定义:

Delegate语句定义委托类的参数和返回类型。任何具有匹配参数和返回类型的过程都可用于创建此委托类的实例。然后就可以调用委托的Invoke方法,通过委托实例调用此过程。可以在命名空间、模块、类或结构级别声明委托,但不能在过程内声明。每个委托类都定义一个被传递对象方法规范的构造函数。委托构造函数的参数必须是对方法或lambda表达式的引用。若要指定对方法的引用,请使用下面的语法:

AddressOf[expression.]methodname

expression的编译时类型必须是类或接口的名称,而该类或接口包含签名与委托类的签名相匹配的指定名称的方法。methodname可以是共享方法,也可以是实例方法。即使为类的默认方法创建了委托,methodname也不是可选项。

若要指定lambda表达式,请使用下面的语法:

Function([parmAstype,parm2Astype2,...])expression

函数的签名必须与委托类型的签名相匹配。有关lambda表达式的更多信息,请参见Lambda表达式。

(更多关于委托的说明,可以看MSDN

委托的定义和调用也是三步:

定义:

DelegateSub名称(参数1,参数2..)

这里可以带参数,也可以没有参数,要看你下面要委托的过程有没有参数,总之委托的名称要与被委托的过程名参数一至。

实例化:

DimDg_txtAsNewDg(AddressOf过程名)实例化

委托:

Me.Invoke(Dg_txt,参数1…)

下面看一个完整的多线程及委托的实例:

此实例是实现二个Textbox控件同时飙数字,二个控件飙数字快慢不同,是通过二个线程控制的。

在窗体上绘2TextBox和一个按扭

ImportsSystem

ImportsSystem.Threading

PublicClassForm1

DimTdAsSystem.Threading.Thread'定义一个线程

DimSdAsSystem.Threading.Thread

DimnAsInt32

DelegateSubDg(ByValvAsInt32,ByValobjAsTextBox)

PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.Click

Td=NewSystem.Threading.Thread(AddressOfabc)'实例化,指向abc过程

Td.Start()'开始运行线程

Sd=NewSystem.Threading.Thread(AddressOfab)'实例化,指向ab过程

Sd.Start()'开始运行线程

EndSub

Subabc()'Textbox1的线程

DimDg_txtAsNewDg(AddressOftxt)

ForMe.n=0To100000000

Me.Invoke(Dg_txt,n,TextBox1)

System.Threading.Thread.Sleep(10)'让它走慢一点

Next

EndSub

Subab()'Textbox2的线程

DimDg_txtAsNewDg(AddressOftxt)

DimiAsInt32

Fori=0To2000000

Me.Invoke(Dg_txt,i,TextBox2)'这里Invoke有三个参数,而过程txt只有二个参数

System.Threading.Thread.Sleep(100)'Textbox110

Next

EndSub

PrivateSubForm1_FormClosed(ByValsenderAsObject,ByValeAsSystem.Windows.Forms.FormClosedEventArgs)HandlesMe.FormClosed

Td.Abort()'中止线程

Sd.Abort()

EndSub

'----------------------------------------------------------------

'---这个过程用到了参数,Textbox1Textbox2都是通过此过程来赋值

Subtxt(ByValiAsInt32,ByValobjAsTextBox)

DimhAsNewTextBox

h=obj

h.Text=i.ToString

EndSub

EndClass

关于线程还有很多知识,什么线程池,多线程同步,可以带参数及返回值的线程,等等。

我们上面的例子只是简单的多线程操作及委托的使用,只是入门级别的,想了解多线程更高深的就自动无视吧。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")