开始运用的TimeSpan相减的体式格局,在Thread的启动函数中也就是如许写的:
public void CountTime() { while (true) { TimeSpan tsNew = new TimeSpan(DateTime.Now.Ticks); TimeSpan tsIn = tsNew - tsOld; if (tsIn.Minutes >= 1) { while (true) { TimeSpan tsNewer = new TimeSpan(DateTime.Now.Ticks); TimeSpan tsIner = tsNewer - tsNew; if (tsIner.Minutes >= 10) { //十分钟后线程重启 tsOld = tsNew; break; } } } } }
厥后发明这类要领效力太低了。固然,能够运用Thread.Sleep(20);这个函数下降CPU占用时候。实在中心到场Thread.Sleep(20);便可显著的下降CPU斲丧。厥后发明C#中的Thread中自带有函数join(),这个函数能够使线程守候一段时候。挪用要领以下
th.Join(new TimeSpan(hours, minutes, seconds));在守候的这段时候里线程处于WaitSleepJoin状况。
固然也能够挪用Thread.Sleep(millionseconds);这里提一下Sleep和Join的区分
当线程实行Sleep时体系就退出实行行列一段时候,当就寝完毕时,体系会发作一个时钟中断,从而使线程回到实行行列中恢复线程的实行。Sleep要领假如参数是0,代表这个线程应该挂起让其他守候的线程运转,这里cpu回重新分配掌握权,也有多是适才的实行的顺序。如许就会有cpu占用老是100%的状况发作。偶然你界面死了,然则你照样能够挪动鼠标。假如是Timeout.Infinite,就代表将使线程休眠,直到它被挪用 Thread.Interrupt 的另一个线程中断或被 Thread.Abort 中断为止。
假如父线程先于子线程完毕,那末子线程将在父线程完毕的同时被迫完毕。Thread.Join()要领使父线程守候,直到子线程完毕。Join要领有返回值,当值为true,代表线程住手。false的话代表线程在守候了那段时候后还未住手。假如在线程Unstarted状况时,挪用join()就会有ThreadStateException非常。假如线程已住手,那末挪用这个函数,会马上取得返回值。
例以下面的主顺序
... ThreadStart st = New ThreadStart(fun); Thread th = new Thread(ThreadStart st); th.Start(); Application.Exit(); ... //下面是fun函数 void fun() { while(true) { ... } }
这段顺序的唯一缺点就是有可能在主顺序退出后,从线程还没有完毕。(这个从线程真可怜...)
这里趁便再提一下线程的几个状况:
建立:当建立一个新历程时,也为该历程建立了一个线程。线程还能够建立新线程。
停当:线程已取得除处置惩罚机外的一切资本。
运转:线程正在处置惩罚机上实行。
壅塞:线程因守候某事宜而停息运转。
住手:一个线程已完成。
然则C#的线程中多了几个状况:
Aborted,AbortRequested,Background,Running,Stopped,StopRequested,Suspended,SuspendRequested,Unstarted,WaitSleepJoin。
Abort()将致使ThreadState.AbortRequested挪用Abort()的线程取得掌握权以后致使ThreadState.Aborted,AbortRequested与Aborted的区分在于一个住手一个未住手。而Stopped则是线程住手。然则我重复实验屡次发明当挪用Abort()函数后,线程状况会变成Stopped。怎样变成Aborted状况,还在研讨中。其他几个状况差不多。都是挪用响应的函数会发作响应的状况要求,另有过一段时候才究竟响应的状况。至于Unstarted是还未挪用Start()函数,Running是挪用Start()或许Resume()函数的效果。WaitSleepJoin是在守候I/O,或许是挪用Join()要领。这里Join()和Sleep()要领的差别还在于挪用Join()线程状况进入WaitSleepJoin,挪用Sleep()线程状况照样Running。
挂起线程的要领是Suspend();挪用这个要领后,线程处于SuspendRequest状况。Suspended()挪用后假如线程仍然在实行join()要领,由于Suspended()要让线程抵达平安点以后它才够将该线程挂起,此时那线程状况就是SuspendRequested|WaitSleepJoin。然则这里的join里的时钟依旧在计数。所以如今还不晓得用什么要领来停息这个join计数,固然也能够不运用join处理完全停息线程这个题目。如今不明白哪一个Suspended()函数是干什么的,由于线程依旧在运转中。别的值得一提的是如今不首倡运用Suspend()和让线程挪用Suspend()后再次恢复的Resume()要领。缘由很简朴,由于这两个要领是由别的的线程实行,别的的线程并不能正确的晓得被Suspend()的线程处于何种状况,如某个类的组织函数实行时代,或许析构等。所以用这个函数来同步很风险。
别的,要注意的是Thread.Sleep(n)这个n不能准确的掌握时候。假如你以为要线程要隔多长时候,这个掌握就有题目。假如当前的线程是一个前台线程,那末Thread.Sleep(n)就要在大于n的时候才退出。假如是背景历程,当主顺序退出后,这线程就再也不能叫醒..凄惨..所以平常也发起不必Thread.Sleep()函数。别的Sleep函数也不能用于同步.peter说顺序的Sleep函数代表了一个很烂的设想。
以上就是细致引见C#Thread点点滴滴的细致内容,更多请关注ki4网别的相干文章!