线程分为前台线程和后台线程,一个进程里至少要有一个前台线程若干后台线程,如果前台线程结束了,意味着进程也就退出了;
线程主要有4种状态:Unstarted、Running、WaitSleepJoin(阻塞)、Stopped(停止)
c# Thread.Abort()和Thread.ResetAbort()的使用
Thread类的Abort()方法用于终止正在运行的线程(.net core中Abort()方法虽然存在,但是调用它会引发PlatformNotSupportedException的异常提示)。它可以强行终止线程,而不管线程是否是sleep中。
执行了Abort()后,被终止的线程就会继续运行catch{}finally{}块中代码,因为是强行终止,catch块之后的语句则不再运行。除非在catch语句中执行Thread.ResetAbort()这个静态方法。
先举例没有ResetAbort()的情况:
<span style="font-size:14px;">using System; using System.Threading; namespace AbortAndResetabortExp { class Program { static void Main(string[] args) { Thread t = new Thread(DoWork); t.Name = "八戒"; t.Start(); Thread.Sleep(10000); Console.WriteLine("悟空:八戒,该起床了"); t.Abort(); } static void DoWork() { try { while (true) { Console.WriteLine(Thread.CurrentThread.Name + ":呼呼~~~~~"); Thread.Sleep(1000); } } catch (ThreadAbortException e) { Console.WriteLine(Thread.CurrentThread.Name + ":还早呢,我还要再睡会"); Thread.ResetAbort(); } for (int i = 0; i < 10; i++) { Console.WriteLine(Thread.CurrentThread.Name + ":呼呼~~~~~"); Thread.Sleep(1000); } } } }</span>
实例中,主线程启动“八戒”线程,使其“呼呼”睡觉。10秒钟后,主线程通过调用“八戒”线程的Abort方法中止“八戒”线程,“八戒”线程的Abort方法被调用后会触发ThreadAbortException异常,“八戒”线程捕获到该异常后,使用ResetAbort方法取消中止线程的操作,因为他还没有睡够呢。
整个程序的执行结果如下图所示,从结果中可以看出,调用ResetAbort方法后,线程仍然在执行。
原文:https://www.cnblogs.com/MethodInvoke/p/14603342.html