多线程

单线程给我们带来的问题:单线程会导致计算机运行复杂程序的时候,其他方面的功能会进入假死状态,就是会影响到其他功能

所以我们用多线程来分担这种复杂的程序计算,从而让主程序不受到影响

多线程可以让计算机同时做多件事情,节约时间

多线程可以让一个程序同时处理多个事情

后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况

获得当前线程和当前进程

 

产生一个线程的四个步骤:

编写产生线程所要执行的方法

引用system.Threading命名空间

实例化Thread类,并传入一个指向线程所要运行方法的委托。(这时候这个线程已经产生,但是还没有运行)

调用Thread实例的start方法,标记该线程可以被CPU执行了,但具体执行时间由CPU决定

两个线程同时运行

 

如果线程执行的方法需要参数,那么要求这个参数必须是object类型

 

 

在.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

 

posted @ 2021-08-22 15:49  静态类  阅读(103)  评论(0编辑  收藏  举报