c# 多线程学习(1):thread 传参,传函数指针;
1, Thread 类的 实现线程其构造函数 有两种委托类型,一种是ThreadStart 委托,就是比Acton委托多了【comvisible】?的特性,就是启动线程,不用带参数的;另一种是ParameterizedThreadStart,似乎类似于Func<obj>,多了特性;
相对应,启动线程是无参和有参的;
1 static void Main(string[] args) 2 { 3 int n = 5; 4 for (int i = 0; i < 20; i++) 5 { 6 ///obj 任意类型可以对obj传参,基本类型使用的时候似乎不用转换; 7 Thread td = new Thread((obj) => Console.WriteLine($"obj={obj}")); 8 td.Start(i); 9 } 10 ///线程不带参,传递是ThreadStart 委托; 11 Thread td1 = new Thread(() => { Console.WriteLine("td1,hello"); }); 12 Thread td2 = new Thread(hi); 13 14 15 ///委托相当于本地函数,可以访问无妨碍访问本地变量。但本地函数没有委托灵活 16 void hi() 17 { 18 Console.WriteLine(n); 19 } 20 21 22 td1.Start(); 23 td2.Start(); 24 Console.Read(); 25 }
对于传参 有点风骚的是,可以是NEW ACTION(.....) 这种lamda 表达式;
风骚的代码; 传递lamda ,可以利用线程的封装;;
更正,lamda 似乎也分传值和传值对象的 不同;;
比如 不能完全看同 ()=>cosole.writeline("hello") 和new action(()=>cosole.writeline("hello"));
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 int n = 5; 6 for (int i = 0; i < 20; i++) 7 { 8 ///obj 任意类型可以对obj传参,基本类型使用的时候似乎不用转换; 9 Thread td = new Thread((obj) => { (obj as Action)(); }); 10 td.Start(new Action(()=> { Console.WriteLine("hello,im not lamda"); })); 11 } 12 ///线程不带参,传递是ThreadStart 委托; 13 Thread td1 = new Thread(() => { Console.WriteLine("td1,hello"); }); 14 Thread td2 = new Thread((obj) => { (obj as Action)(); }); 15 16 17 ///委托相当于本地函数,可以访问无妨碍访问本地变量。但本地函数没有委托灵活 18 void hi() 19 { 20 Console.WriteLine("hello"); 21 } 22 23 24 td1.Start(); 25 26 ///风骚 27 td2.Start(new Action(hi)); 28 Console.Read(); 29 } 30 }

浙公网安备 33010602011771号