一、异常处理
1.语法错误
2.Run-Time错误
3.逻辑错误
异常处理机制
Try
...
Catch ex As 异常处理类
...
Finally
...
End Try
异常处理类
ApplicationException 发生非关键性应用程序错误时所返回的异常情况
ArgumentException 当其中一个提供给方法的自变量为无效时所返回的异常情况
ArgumentNullException 由不允许自变量为Null的方法返回的异常情况
ArgumentOutOfRangeException 由验证自变量超出指定范围内的方法返回的异常情况
DirectoryNotFoundException 找不到文件或目录的一部分时所返回的异常情况
DivideByZeroException 尝试将整数或小数值除以零时所返回的异常情况
EndOfStreamException 尝试超过数据流末端进行读取时所返回的异常情况
Exception 所有异常情况的基底类
ExternalException 发生所有以Runtime外部环境为目标的异常情况的基底类
FileNotFoundException 尝试访问不存在于磁盘上的文件失败时所返回的异常情况
IndexOutOfRangeException 当数组索引不正确时,由Runtime返回的异常情况
InvalidCastException 无效的数据类型(Casting)或明确转换所返回的异常情况
InvalidOperationException 当方法调用对对象的目前状态是无效时所返回的异常情况
NullReferenceException 当参考Null对象时,由Runtime返回
OutOfMemoryException 当没有足够的内存继续运行程序时,所返回的异常情况
StackOverflowException 当运行堆栈因为具有过多暂停方法调用而溢出时所返回的异常情况
SystemException 所有Runtime所产生错误基底类
抛出异常
Throw new InvalidCastException
二、多线程
Imports System.threading
Module Module1
Sub Main()
'显示线程的编码
Console.WriteLine(Thread.CurrentThread.GetHashCode)
while(True)
'显示一个随机数
Console.Write(Int(Rnd()*42)+1&" ")
'线程停止一秒钟
Thread.CurrentThread.Sleep(1000)
End While
Console.ReadLine()
End Sub
End Module
创建多线程
第一种
在创建多线程之前,必须先创建一个新对象,以便赋值给线程来负责运行
Dim m1 As New game_machine("game")
Dim t1 As New System.Threading.Thread(AddressOf m1.generate_number)
game是类名称,m1是对象名称,设置起始程序为generate_number方法
启动线程
t1.Start()
第二种
Dim t1=New game_machine2()
t1.startup()
Public Class game_machine2
private thread1 As Thread
Public Sub startup()
Dim threadx As TRhreadStart
threadx=New ThreadStart(AddressOf Me.Start)
thread1=New Thread(threadx)
thread1.start()
End Sub
Private Sub Start()
...
End Sub
End Class
查看线程状态
使用ThreadState属性可以了解每一个线程的状态
Aborted 线程在Stopped状态
AbortRequested Abort方法已在线程上被调用,但线程还没有收到尝试终结它的暂停
Background 线程正作为背景线程运行中
Running 线程已经启动,并未受封锁,也没有暂停
Stopped 线程已经停止
StopRequested 线程正被要求停止中
Suspended 线程已经暂停
SuspendRequested 线程正被要求暂停中
Unstarted Thread.Start 方法还没有在线程上被调用
WaitSleepJoin 线程因为调用Wait、Sleep或Join而被封锁
线程属性
ApartmentState 取得或设置线程为单一线程(STA)或多线程(MTA)状态
IsAlive 目前线程的运行状态
IsBackground 取得或设置线程是否为背景线程
IsThreadPoolThread 取得线程是否属于Managed线程集区
ThreadState 取得线程的状态
线程方法
Abort 退出线程
AllocaeDataSlot 在所有的线程上分配未命名的数据位置
AllocateNamedDataSlot 在所有的线程上分配命名的数据位置
GetData 从目前线程指定位置捕获数值
Interuupt 中断在WaitSleepJoin线程状态的线程
Join 封锁调用线程,直到线程退出为止
ResetAbort 取消目前线程要求的Abort
Resume 使暂停的线程继续
SetData 在目前运行的线程上的指定位置中设置数据
Sleep 在指定的毫秒数内封锁目前的线程
Start 将目前运行个体的状态变更为ThreadState.Running
Suspend 将线程暂停,或者如果线程已经暂停,则没有影响
线程优先权
Priority属性可以设置线程的优先权,其权值优先级如下:
Highest > AboveNormal > Normal > BelowNormal > Lowest
优先权值高的线程将占用较多的CPU资源,而优先权值低的线程必须等待其他较高权值的线程运行后才会轮到使用CPU资源。
线程调度
创建两个线程对象,如果希望第一个线程运行完成,再运行第二个线程,则可以使用Join方法实现
t1.Start()
t1.Join()
t2.Start()
t2.Join()
线程同步
使用Mutex对象的WaitOne方法和ReleaseMutex方法,可以限制同一时间只能有一个线程对象运行该方法,其他想要运行这个方法的线程必须等到此方法空闲时才能开始运行。
Private Shared mut1 As New Mutex
mut1.WaitOne()
...
mut1.ReleaseMutex
线程间沟通
Monitor.Wait() 让线程进入等待状态
Monitor.Pulse() 唤醒第一个进入等待状态的线程
Monitor.PulseAll() 唤醒所有等待状态的线程