一、多线程:
1、概念:
线程:是Windows任务调度的最小单位。线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
多线程:是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务(代码),也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。
2、为什么要用多线程:
①让计算机"同时"做多件事情,节约时间。
②多线程可以让一个程序“同时”处理多个事情。
③后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况。
3、产生一个线程的4步骤:
编写产生线程所要执行的方法
引用System.Threading命名空间
实例化Thread类,并传入一个指向线程所要运行方法的委托。(这时候这个线程已经产生,但是还没有运行)
调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定。
4、.net中如何实现多线程: View Code View Code
线程肯定也是要执行一段代码的。所以要产生一个线程,必须先为该线程写一个方法,这个方法中的代码就是该线程运行所要执行的代码。(找个人来做一件事情)
线程启动时,通过委托调用该方法。(委托的好处)
(线程启动时,调用传过来的委托,委托就会执行相应的方法,实现线程执行方法)
案例代码:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;namespace _07多线程{ class Program { static void Main(string[] args) { Console.WriteLine("主线程 {0} 正在执行中...", Thread.CurrentThread.ManagedThreadId); #region 线程 //ThreadStart 无参无返回值的委托 Thread thread = new Thread(ShowMsg);//新开启一个线程执行一个方法 //建议操作系统把当前线程搞成高级别 thread.Priority = ThreadPriority.Highest; //给开发人员用,来识别不同的线程 thread.Name = "zy"; //后台线程: 如果所有的前台线程都退出了,那么后台线程自动被关闭 thread.IsBackground = true; thread.Start();//并没有执行,告诉操作系统准备就绪 //thread.Abort();//关闭线程 Console.ReadKey(); #endregion } static void ShowMsg() { Console.WriteLine("工作线程 {0} 执行中...",Thread.CurrentThread.ManagedThreadId); Thread.Sleep(2000); } }}
运行截图:
5、Thread类的一些重要成员:
Start()启动线程
Abort()终止线程
Thread.Sleep(1) 静态方法,可以使当前线程停止一段时间运行
Name线程名
Thread.CurrentThread获得当前的线程引用
-----------------------------------------------------------------------------------
二、委托的异步调用:
1、了解一下几点:
BeginInvoke 异步调用
EndInvoke 获取异步调用的(方法)返回值
IAsyncResult 异步操作的状态
AsyncResult 异步操作的结果(可以获取当前执行的委托对象)
using System.Runtime.Remoting.Messaging;
注意:委托的异步调用只对单播委托
案例代码:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Runtime.Remoting.Messaging;namespace _07多线程{ public delegate int AddDel(int a,int b);//声明一个有参数有返回值的委托 class Program { static void Main(string[] args) { Console.WriteLine("主线程 {0} 正在执行中...", Thread.CurrentThread.ManagedThreadId); AddDel addDel = new AddDel(AddFunc); //1.同步调用 //int c = addDel(1, 2); //2.无回调函数的异步调用 //启动委托指向的方法来执行,具体由线程池提供一个线程来执行当前的委托指向的方法 //IAsyncResult ascResult = addDel.BeginInvoke(1, 2, null, null); //while (!ascResult.IsCompleted) //{ // //主线程执行的其他操作 //} ////此EndInvoke方法会阻塞当前线程。直到委托方法执行完毕后, ////并将返回值交给result后,继续执行后面的代码 //int result = addDel.EndInvoke(ascResult); //Console.WriteLine(result);//3 //Console.ReadKey(); //3.有回调函数的异步调用 IAsyncResult ascResult = addDel.BeginInvoke(1, 2, MyDelCallBack, 3); //主线程可继续执行其他操作 Console.WriteLine("==========="); Console.ReadKey(); } static int AddFunc(int a, int b) { Console.WriteLine("AddFunc工作线程运行中...{0}", Thread.CurrentThread.ManagedThreadId); //Thread.Sleep(1000); return a + b; } //异步委托执行完成了的回调函数 public static void MyDelCallBack(IAsyncResult result) { //把接口类型转换成实例类型 AsyncResult aResult = (AsyncResult)result; //转换成我们自己的委托类型 AddDel del = (AddDel)aResult.AsyncDelegate; //执行完成获取执行的结果 int addResult = del.EndInvoke(result); int state = (int)aResult.AsyncState;//3 Console.WriteLine("异步完成的回调方法执行的结果是:{0} @{1}", addResult, Thread.CurrentThread.ManagedThreadId); } } }
运行截图:
执行步骤:
①从线程池里获取一个线程。
②执行委托指向的方法(在工作线程里面执行)
③调用回调函数(如果是null不执行)。