线程
只要有一个前台线程在运行,应用程序的进程就在运行,如果多个前台线程在运行,
但main方法结束了,应用程序的进程仍然在运行,直到所有的前台线程完成其任务为止
默认情况下,用Thread类创建的线程是前台线程。线程池的线程总是后台线程
开启线程方式
1.通过委托开启线程
系统委托方式:Action<>,Func<> -->绑定方法,开启线程就会与主方法同时执行
通过委托名.BeginInvoke(传入方法的参数)
1.1 回调函数:执行完线程后,重新开启一个线程
绑定方法
BeginInvoke(传入方法的参数,回调一个委托类型的函数,参数)
函数:回调函数,线程结束之后回调用此方法
参数:回调函数的参数
IAsyncResult可以获取当前线程状态,获取状态可以用IsCompleted方法检测当前线程是否结束
EndInvoke()获取线程的结果,括号里需要线程状态类型的参数
AsyncWaitHandle.WaitOne()该方法用于等待一段时间,判断线程是否结束
2.通过Thread类开启线程
1.创建对象,构造函数参数为开启线程所需要的方法,这个线程没有启动
2.启动线程 start()方法
2.1有参数传递
法一:启动方法里加参数 start(数据)
法二:使用类,声明对象时传递数据;通过Thread声明对象时,传入对象的方法)
2.2Thread类可以设置为后台线程,方法为IsBackGround
2.3Thread类可以挂起,方法为Therad.sleep()
2.4Thread类可以终止当前线程,方法为Abort()
2.5Thread类可以结束挂起,方法为Join()
线程的优先级:Priorty
控制线程
3.线程池:
1.线程池是一个后台线程,如果进程的所有前台进程结束了,所有的后台进程就会停止
2.不能把入池的线程改为前台线程
3.不能给入池的线程设置优先级
4.入池的线程只能处理时间短的任务
4.任务线程
Task类,线程要执行的方法放在声明里
TaskFactory,线程需要执行的方法放在启动方法里
对象.ContinueWith(方法),用于执行完某个线程之后执行另一个方法,用Task类型的对象接收 Task.CurrentId 线程ID
对象.ID 实例ID,(调用该方法的线程名)
任务线程名.status获取当前线程状态
当多个线程访问一个变量时,会出现冲突,该情况可以使用lock(参数){方法}锁定,锁定后在同一时刻只能有一个线程调用此方法