【C#多线程编程实战笔记】一、 线程基础
创建线程
Thread :所执行的方法不能有参数。
class Program { static void Main(string[] args) { Console.WriteLine("主线程开始...."); Thread t = new Thread( print_1); t.Start(); print_2(); Console.ReadLine(); } static void print_1() { Console.WriteLine("线程开始..."); string[] a = {"a","b","c","d","e","f","g"}; for (int i = 0; i < 7; i++) { Console.WriteLine(a[i]); } } static void print_2() { Console.WriteLine("主线程调用方法..."); for (int i = 0; i < 50; i++) { Console.WriteLine(i); } } }
ParameterizedThreadStart:可以接受一个输入参数
static void Main(string[] args) { Thread ts = new Thread(new ParameterizedThreadStart(print_3)); ts.Start("123"); Console.ReadLine(); } static void print_3(object a) { Console.WriteLine($"输出{a}"); }
暂停线程
使线程暂停一段时间而不消耗操作系统资源,程序输出之前,将休眠5秒钟,它会尽可能的少占用CPU时间。
static void Main(string[] args) { Console.WriteLine("主线程开始...."); Thread ts = new Thread(new ParameterizedThreadStart(print_3)); ts.Start("123"); Console.ReadLine(); } static void print_3(object a) { Thread.Sleep(TimeSpan.FromSeconds(5)); Console.WriteLine($"输出{a}"); }
等待线程
让程序等待线程中的计算完成,并使用该线程的结果
static void Main(string[] args) { Console.WriteLine("主线程开始...."); Thread ts = new Thread(new ParameterizedThreadStart(print_3)); ts.Start("123"); ts.Join(); Console.WriteLine("主线程继续运行...."); Console.ReadLine(); }
程序运行时,启动了一个耗时的线程。正常情况下,会先打印出 "主线程继续运行....",然后在输出线程中的文字,但我们在程序中调用了ts.Join()方法,该方法允许我们主线程等待线程ts运行完时,主程序再继续运行。借助这个方法可以实现两个线程同步执行步骤,第一个线程会等待另一个线程的结果在继续执行,这时候,第一个线程等待时处于阻塞状态。
线程状态
ts.ThreadState.ToString()
Thread.CurrentThread.ThreadState.ToString()
ps:始终可以通过Thread.CurrentThread静态属性获得当前Thread对象
向线程传递参数
两种:
var t1 = new Thread(TestCounter),其中TestCounter方法必须是obejct类型的单个参数
var t2 =new Thread(()=>TestCounter2(12)),使用lambda表达式