多线程
-
进程:Process类--就是C#程序中的一个进程类,一个正在运行的应用程序在操作系统中可以认为是一个进程,包含了一个运行程序所需要的内存资源
该进程一般包含一个或者多个线程,但至少有一个线程。
进程之间是相互独立的,一个进程无法访问到另一个进程里的数据资源的,在进程当中可以有多个线程同时执行代码,一个进程的运行失败并不会影响其他进程的运行
-
线程:Thread类--就是C#程序中的一个线程类,线程是操作系统分配处理器时间的基本单元,一个进程可以包含多个线程,在多个线程当中需要确定一个主线程,在进程入口执行的第一个线程一般被认为是这个进程的主线程。在.Net应用程序中,都是以Main()方法作为程序的入口,调用这个Main()方法的那个线程我们称之为主线程。
线程在操作系统当中主要有三块内存区域构成的:CPU寄存器(记录当前线程的状态),调用栈(维护线程执行的内存与数据),线程本地存储器(Thread Local Storage)TLS---存储线程的状态信息)
后台线程(守护线程):后台线程是通过前台线程设置转换过来的,只有当所有的前台线程结束,与之关联的后台线程才会自动结束
前台线程:默认启动的线程都是前台线程,默认使用Thread类创建的线程都是前台线程,当应用程序当中所有的前台线程结束,此时该应用程序才会结束关闭。
-
同步:分开执行,one by one 多个线程按照顺序依次执行,每次执行一个线程,不能跳跃,前面的线程没有执行完,后面的线程只能排队等待
通过锁机制实现同步机制
-
异步:同时执行,多个线程同时执行,最终的结果,可能多个线程同时结束,也可能前后结束
-
并发:多个线程在同一个时间段内交替执行的场景。(异步的一种场景)
-
并行:多个线程在某一个时间点上同时执行的场景,一般不存在
一个CPU在同一时刻只能运行一个线程,但是多个CPU在同一时刻可以运行多个线程(同时)
进程
// 引入Process进程 using System.Diagnostics; namespace_04_Process进程 { public partial class Form1 :Form { public Form1O { InitializeComponentO; } //获取当前正在运行的进程 private void button1_click(object sender, EventArgs e) { Process[] processes = Process.GetProcessesO; //string str = ""; int count = O; foreach (Process process in processes) { //str+= process.ProcessName + "Nn"; //if (process.ProcessName.Equals C"mspaint") //{ //process.Kil1O: //MessageBox.Show("QQ关闭成功"); //} textBox1.AppendText (process.ProcessName + "IrIn"); if (count % 5 = 0) { textBox1.AppendText(Environment.NewLine); } count++; } //MessageBox.Show(str); }
//关闭指定进程 private void button2_click(object sender, EventArgs e) { string processName = textBox2.Text; Process[] processes = Process.GetProcesses(; foreach (Process process in processes) { if (process.ProcessName.Equals(processName)) { process.Kill(); } } } //打开指定进程 private void button3_click(object sender, EventArgs e) { string processName = textBox2.Text; // StartO //Process.Start (processName); //打开记事本,控制面板,画图工具 Process process = new Process (); //打开进程信息 ProcessStartInfo startInfo = new ProcessStartInfo(processName); process.StartInfo = startInfo; process.Start(); } private void button4_click(object sender, EventArgs e) { Process process = new Process O; //打开进程信息 ProcessStartInfo startInfo = new ProcessStartInfo("c:\IProgram Files\ITencent\IQQNT\IQQ.exe"); process.StartInfo = startInfo; process.Start(); } private void button5_click(object sender, EventArgs e) { //打开指定进程中的某个信息 Process.Start("msedge", "http://www.baidu.com"); }
线程
Thread--线程类
namespace 线程 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } Thread thread; //绑定一个点击事件 private void button1_Click(object sender, EventArgs e) { //开启一个新线程--完成一个任务 thread = new Thread(Print);//高阶函数 都是前台线程 // thread.IsBackground = true;//设置为后台线程 thread.Start(); } public void Print() {//把一些复杂耗时的任务放到分线程中,在主线程中还可以继续操作 for (int i = 0; i < 10000; i++) { textBox1.AppendText( i.ToString() + "\r\n"); } } //绑定一个窗体加载事件 private void Form1_Load(object sender, EventArgs e) {//关闭跨线程非法访问 Control.CheckForIllegalCrossThreadCalls = false; } //绑定一个关闭事件 private void Form1_FormClosing(object sender, FormClosingEventArgs e) {/* 在C#当中,通过Thread创建的任何线程级别和主线程是一样的,都是前台线程 当主线程关闭的时候,并不会阻止分线程的执行,分线程可能会继续执行 当主窗口关闭的时候,并不会关闭当前的应用程序,必须是所有的前台线程全部结束后才会关闭当前应用程序 当前台线程关闭时,与之关联的后台线程会全部关闭 */ //窗体关闭时关闭fen线程 if (thread!=null) { thread.Abort(); } } } }
线程操作
namespace 线程暂停重启 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button3_Click(object sender, EventArgs e) { thread.Resume();//恢复线程 } private void textBox1_TextChanged(object sender, EventArgs e) {//线程状态:运行、未启动、挂起、停止、终止 /* 未启动---》运行 运行---》挂起、停止、终止 挂起---》运行、关闭 */ if (thread != null && thread.ThreadState == ThreadState.Unstarted) { thread.Name = "分线程"; thread.Start(); } else if( thread.ThreadState == ThreadState.Aborted) { thread=new Thread(ChangNumber); thread.Name = "分线程"; thread.Start(); } } Thread thread; private void textBox1_Click(object sender, EventArgs e) { thread = new Thread(ChangNumber); thread.Start(); } public void ChangNumber() { for (int i = 0; i < 100000; i++) { textBox1.Text = i.ToString(); } } private void button2_Click(object sender, EventArgs e) { thread.Suspend();//挂起线程 } private void button4_Click(object sender, EventArgs e) { Thread.Sleep(2000);//Thread指当前正在执行的线程 } private void Form1_Load(object sender, EventArgs e) { thread =new Thread(ChangNumber); Control.CheckForIllegalCrossThreadCalls = false; } } }