本视频从最简单的写法到高级写法逐步讲解多线程类的使用.. 以及增加平时使用到引发的错误,及使用场景进行详细的讲解多线程的应用
最简单的线程的声明 [C#] 纯文本查看 复制代码 Thread th = new Thread(Func); //创建线程[/align]th.Start();//启动线程
private void Func()//线程执行的方法
{
}
学习线程最经典的错误
线程间操作无效: 从不是创建控件“label1”的线程访问它。
小型项目如何解决跨线程访问异常: Control.CheckForIllegalCrossThreadCalls = false;//忽略跨线程间的调用.不推荐大家使用.它可能会引发一些未知的异常.
创建窗口句柄时出错。
引发原因: 窗体被结束,但是线程还未结束
前后台线程的区别 th.IsBackground = true;//当前线程为后台线程 后台线程和前台线程 引发一个错误: 当窗体关闭,方法内没有调用窗体控件时.虽然看着窗体已经结束,但是任务管理器中一样可以看见进程依然在运行. 原因: 启用前台线程,但是UI关闭后,没有通知前台线程结束,主线程并未完全退出.因为只要有一条子线程还在运行,那么它(子线程)将阻塞主线程关闭. 窗体关闭前台线程依然会继续运行.后台线程则不会. 线程的销毁时间
传递非object类型的写法 [C#] 纯文本查看 复制代码 Thread th = new Thread(new ThreadStart(delegate {[/align]GetInfo(strinfo);
}));
th.Start();
ThreadPool 线程池.
ThreadPool.QueueUserWorkItem(new WaitCallback(delegate {
GetInfo(strinfo);
}));
线程池是不可控制的.
Thread.Sleep(100); //睡眠,挂起. 参数(int)单位毫秒 是全局有效.! 全局说的是主线程.
th.Suspend(); //挂起线程 th.Resume(); //继续挂起的线程 ThreadState //线程的状态枚举
应用场景
Post程序,
需要输入验证码
先开启线程,来执行get请求.得到验证码图像,挂起这个线程.等待验证码的输入.
lock (this) //锁 { } 固定任务数.不固定线程数.自己计算需要多少线程
现在这个类的好处: 帮助你理解其他人是如何处理线程的.
两种情况 固定线程数,不固定任务数
固定任务数,自动计算线程数
缺点: 无法重复利用线程.
|