通常情况,如果我们需要一个线程执行一个可控的死循环,那么通常的做法是将你的这个线程方法封装,然后采用信号量的方式来控制
示例代码如下
1 using System; 2 using System.Threading; 3 using System.Threading.Tasks; 4 5 namespace Test 6 { 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 12 var thread = new MyThread(); 13 14 Console.ReadKey(); 15 thread.StopAsync(); 16 Console.ReadKey(); 17 18 } 19 20 } 21 22 public class MyThread 23 { 24 private bool signal = true; 25 26 public MyThread() 27 { 28 Task.Factory.StartNew(Runner); 29 } 30 31 public void StopAsync() { 32 signal = false; 33 } 34 35 private void Runner() 36 { 37 while (signal) 38 { 39 Console.WriteLine(DateTime.Now); 40 //do something..... 41 Thread.Sleep(1000); 42 } 43 Console.WriteLine("Task finish"); 44 } 45 } 46 }
C#的线程中有一个比较特殊的用法Thread.Abort方法(Object)
这个方法可以在线程内部抛出一个异常,以强制终止线程执行,但是这种方法不推荐大范围使用
1 using System; 2 using System.Threading; 3 using System.Threading.Tasks; 4 5 namespace Test 6 { 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 var thread = new Thread(Runner); 12 thread.Start(); 13 Console.ReadKey(); 14 thread.Abort(); 15 Console.ReadKey(); 16 } 17 18 static ThreadStart Runner = delegate () 19 { 20 while (true) { 21 Console.WriteLine(DateTime.Now); 22 Thread.Sleep(1000); 23 } 24 }; 25 } 26 27 }