VB.NET中的线程操作(Thread,Mutex)

前端之家收集整理的这篇文章主要介绍了VB.NET中的线程操作(Thread,Mutex)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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 版之前,这样不会引发任何异常。

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
_thread
NewSystem.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()
_thread
Nothing''执行状态''<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

运行效果如下:

猜你在找的VB相关文章