VB.NET中的线程操作(Thread,Mutex)
发布时间:2020-12-16 22:40:53 所属栏目:大数据 来源:网络整理
导读:VB.NET中的线程操作(Thread,Mutex) By Tyouvivi 2008/04/16 VB.NET 2005 中线程操作稍有点麻烦,Abort()方法调用时会产生 System.Threading.ThreadAbortException 异常信息,而继续已挂起的线程方法Resume()和挂起方法Suspend()也不再支持,线程的暂停、再
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
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 运行效果如下: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |