单线程给我们带来的问题:单线程会导致计算机运行复杂程序的时候,其他方面的功能会进入假死状态,就是会影响到其他功能
所以我们用多线程来分担这种复杂的程序计算,从而让主程序不受到影响
多线程可以让计算机同时做多件事情,节约时间
多线程可以让一个程序同时处理多个事情
后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况
获得当前线程和当前进程
产生一个线程的四个步骤:
编写产生线程所要执行的方法
引用system.Threading命名空间
实例化Thread类,并传入一个指向线程所要运行方法的委托。(这时候这个线程已经产生,但是还没有运行)
调用Thread实例的start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定
两个线程同时运行
在.Net下是不允许跨线程的访问
前台线程:只有所有的前台线程都关闭才能完成程序关闭
后台线程:只要所有的前台线程结束,后台线程自动结束
线程的一些重要成员:
Start()启动线程
Abort()终止线程 终止完成之后不能再Start()
Name线程名
Thread.Sleep()静态方法,可以使当前程序停止运行一段时间
Thread.CurrentThread 获得当前线程的引用
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace 线程 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //创建一个线程去执行这个方法 Thread th = new Thread(Test); ///标记这个线程准备就绪了,可以随时被执行。具体什么时候执行这个线程 ///由 cpu决定 ///将线程设置为后台线程 th.IsBackground = true; th.Start(); } private void Test() { for (int i = 0; i < 10000; i++) { Console.WriteLine(i); } } } }View Code
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace 线程 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } Thread th; private void button1_Click(object sender, EventArgs e) { //创建一个线程去执行这个方法 th = new Thread(Test); ///标记这个线程准备就绪了,可以随时被执行。具体什么时候执行这个线程 ///由 cpu决定 ///将线程设置为后台线程 th.IsBackground = true; th.Start(); } private void Test() { for (int i = 0; i < 10000; i++) { //Console.WriteLine(i); textBox1.Text = i.ToString();//这里跨线程,会报错 } } private void Form1_Load(object sender, EventArgs e) { //取消跨线程的访问 Control.CheckForIllegalCrossThreadCalls = false;//该值提示是否捕获对错误线程的调用,选true就是捕获这个抛异常的报错,选false就不去捕获 } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { //当你点击关闭窗体的时候,判断新线程是否为null if(th!=null) { //立即结束这个线程 th.Abort();//注意,当这个线程被终止之后,是无法重新启动的 } } } }View Code