VB.NET中的线程操作(Thread,Mutex)
By Tyouvivi 2008/04/16
VB.NET 2005 中线程操作稍有点麻烦,Abort()方法调用时会产生System.Threading.ThreadAbortException异常信息,而继续已挂起的线程方法Resume()和挂起方法Suspend()也不再支持,线程的暂停、再开、结束不是很方便,在此使用Mutex类(同步基元)进行线程的操作。
Mutex介绍
当两个或更多线程需要同时访问一个共享资源时,系统需要使用同步机制来确保一次只有一个线程使用该资源。Mutex是同步基元,它只向一个线程授予对共享资源的独占访问权。如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。
可以使用WaitHandle..::.WaitOne方法请求互斥体的所属权。拥有互斥体的线程可以在对WaitOne的重复调用中请求相同的互斥体而不会阻止其执行。但线程必须调用ReleaseMutex方法同样多的次数以释放互斥体的所属权。Mutex类强制线程标识,因此互斥体只能由获得它的线程释放。相反,Semaphore类不强制线程标识。
如果线程在拥有互斥体时终止,则称此互斥体被放弃。将此mutex的状态设置为收到信号,下一个等待线程将获得所有权。从.NETFramework 2.0 版开始,在获取被放弃mutex的下一个线程中将引发AbandonedMutexException。在.NETFramework 版之前,这样不会引发任何异常。
当两个或更多线程需要同时访问一个共享资源时,系统需要使用同步机制来确保一次只有一个线程使用该资源。Mutex是同步基元,它只向一个线程授予对共享资源的独占访问权。如果一个线程获取了互斥体,则要获取该互斥体的第二个线程将被挂起,直到第一个线程释放该互斥体。
可以使用WaitHandle..::.WaitOne方法请求互斥体的所属权。拥有互斥体的线程可以在对WaitOne的重复调用中请求相同的互斥体而不会阻止其执行。但线程必须调用ReleaseMutex方法同样多的次数以释放互斥体的所属权。Mutex类强制线程标识,因此互斥体只能由获得它的线程释放。相反,Semaphore类不强制线程标识。
如果线程在拥有互斥体时终止,则称此互斥体被放弃。将此mutex的状态设置为收到信号,下一个等待线程将获得所有权。从.NETFramework 2.0 版开始,在获取被放弃mutex的下一个线程中将引发AbandonedMutexException。在.NETFramework 版之前,这样不会引发任何异常。
ThreadState Form
三个按钮: ButtonStart、ButtonPause、ButtonStop
两个状态Label: 执行状况、LabelStatus
代码如下:
Public
ClassThreadState
'''<summary>
''状态''</summary>''<remarks></remarks>EnumThreadStateAsInteger
Runing=1'执行中Paused2'暂停Stoped3'结束EndEnum
''线程Private_threadSystem.Threading.Thread
''同步基元,用于进程间同步。_mutexThreading.Mutex
''线程状态_state''线程调用外部控件方法(Delegate)''<paramname="text"></param>DelegateSubSetTextCalled(ByVal[text]String)
''FormLoad''<paramname="sender"></param>''<paramname="e"></param>ThreadTest_Load(senderSystem.Object,eSystem.EventArgs)HandlesMyBase.Load
'状态初期化Me._stateThreadState.Stoped
'按钮初期化SetButtonState()
SetText("未开始...EndSub''执行Execute()
Dimi'执行直到结束DoWhileNotThreadState.Stoped
_mutex.WaitOne()
_mutex.ReleaseMutex()
SetText(执行中...&i)
i+=
Threading.Thread.Sleep(1000)
Loop
SetText(结束''线程开始,再开ButtonStart_Click(ButtonStart.Click
IfThreadState.StopedThen
_threadNewSystem.Threading.Thread(AddressOfExecute)'线程开始'同步基元初始化Threading.Mutex
_thread.Start()
ElseIfThreadState.Paused'线程再开'同步基元释放(线程继续)_mutex.ReleaseMutex()
End'线程状态ThreadState.Runing
SetButtonState()
''暂停ButtonPause_Click(ButtonPause.Click
SetText("Pasue")'同步基元暂停(线程暂停)_mutex.WaitOne()
.ButtonStart.EnabledTrueThreadState.Paused
SetButtonState()
''结束ButtonStop_Click(ButtonStop.Click
'状态设置ThreadState.Stoped
SetButtonState()
_threadNothing''执行状态''<paramname="str"></param>SetText(str'线程中调用时需要Invoke(Invokerequired=True).LabelStatus.InvokerequireddSetText)
.Invoke(d,255)">Object(){})
Else.LabelStatus.Text''按钮状态SetButtonState()
SelectCase._state
ThreadState.Runing
False.ButtonPause.Enabled.ButtonStop.EnabledThreadState.Paused
.ButtonStart.TextResumeStartEndClass
'''<summary>
''状态''</summary>''<remarks></remarks>EnumThreadStateAsInteger
Runing=1'执行中Paused2'暂停Stoped3'结束EndEnum
''线程Private_threadSystem.Threading.Thread
''同步基元,用于进程间同步。_mutexThreading.Mutex
''线程状态_state''线程调用外部控件方法(Delegate)''<paramname="text"></param>DelegateSubSetTextCalled(ByVal[text]String)
''FormLoad''<paramname="sender"></param>''<paramname="e"></param>ThreadTest_Load(senderSystem.Object,eSystem.EventArgs)HandlesMyBase.Load
'状态初期化Me._stateThreadState.Stoped
'按钮初期化SetButtonState()
SetText("未开始...EndSub''执行Execute()
Dimi'执行直到结束DoWhileNotThreadState.Stoped
_mutex.WaitOne()
_mutex.ReleaseMutex()
SetText(执行中...&i)
i+=
Threading.Thread.Sleep(1000)
Loop
SetText(结束''线程开始,再开ButtonStart_Click(ButtonStart.Click
IfThreadState.StopedThen
_threadNewSystem.Threading.Thread(AddressOfExecute)'线程开始'同步基元初始化Threading.Mutex
_thread.Start()
ElseIfThreadState.Paused'线程再开'同步基元释放(线程继续)_mutex.ReleaseMutex()
End'线程状态ThreadState.Runing
SetButtonState()
''暂停ButtonPause_Click(ButtonPause.Click
SetText("Pasue")'同步基元暂停(线程暂停)_mutex.WaitOne()
.ButtonStart.EnabledTrueThreadState.Paused
SetButtonState()
''结束ButtonStop_Click(ButtonStop.Click
'状态设置ThreadState.Stoped
SetButtonState()
_threadNothing''执行状态''<paramname="str"></param>SetText(str'线程中调用时需要Invoke(Invokerequired=True).LabelStatus.InvokerequireddSetText)
.Invoke(d,255)">Object(){})
Else.LabelStatus.Text''按钮状态SetButtonState()
SelectCase._state
ThreadState.Runing
False.ButtonPause.Enabled.ButtonStop.EnabledThreadState.Paused
.ButtonStart.TextResumeStartEndClass
运行效果如下:
原文链接:https://www.f2er.com/vb/260493.html