进程:
一般来说,一个程序就是一个进程,不过也有一个程序需要多个进程支持的情况。
进程要使用的类是:Process
它在命名空间:System.Diagnostics;
1、静态方法Start();
2、也可以实例化对象,来调用Start()普通方法,但调用普通方法之前需要给
StartInfo属性设置一个对象,来通知它要打开的是哪个进程(绝对路径)
private void button1_Click(object sender, EventArgs e) { Process.Start("chrome"); }
也可以实例化对象,来调用Start()普通方法,但调用普通方法之前需要给
StartInfo属性设置一个对象,来通知它要打开的是哪个进程
//获取路径 private void button2_Click(object sender, EventArgs e) { openFileDialog1.Filter = "应用程序|*.exe"; DialogResult dr = openFileDialog1.ShowDialog(); if(dr==DialogResult.OK) { textBox1.Text = openFileDialog1.FileName; } } //打开文件 private void button3_Click(object sender, EventArgs e) { Process p = new Process(); ProcessStartInfo psi = new ProcessStartInfo(textBox1.Text); p.StartInfo = psi; p.Start(); } 复制代码
进程
线程:
一个进程就像是一个公司,默认只有一个老板
老板叫做 主线程
主线程一旦让它去执行一段需要时间的代码,那么就会出现
程序假死,失去控制
原因是:线程同一时间只能做一件事,而主线程是操作窗体控制的,一旦被占用,那么窗体就没人控制了。
解决办法:
招一个员工帮老板干这个活
开启线程: 使用Thread类
线程基本使用:
//创建一个线程对象,告诉它要执行的是哪一个方法
Thread th = new Thread(aaa);
//准备好了,开始执行,不是立即开始,CPU决定什么时候开始
th.Start();
---------------------------------------------------------------
需要跨线程访问对象:
线程需要执行一个方法,而这个方法允许有一个参数,并且这个参数必须是object类型的
程序默认不允许跨线程访问对象,因为监控开着
需要关闭监控
在构造函数的构造方法下面写上:
Control.CheckForIllegalCrossThreadCalls = false;
---------------------------------------------------------------
程序退出立刻关闭所有线程:
线程默认开启为前台线程,程序必须将所有的前台线程执行完毕后才会真正退出程序
解决办法:将线程变为后台线程
//设置后台线程
th.IsBackground = true;
public partial class Form1 : Form 2 { 3 public Form1() 4 { 5 InitializeComponent(); 6 //程序默认不允许跨线程访问对象,因为监控开着,需要关闭监控,在构造函数的构造方法下面写上: 7 Control.CheckForIllegalCrossThreadCalls = false; 8 } 9 10 private void button1_Click(object sender, EventArgs e) 11 { 12 //创建一个线程对象,告诉它要执行的是哪一个方法 13 Thread th = new Thread(NewMethod); 14 //设置后台线程 15 th.IsBackground =true; 16 // 17 th.Start(sender); 18 (sender as Button).Enabled = false;//开始后按钮不可用 19 } 20 21 private static void NewMethod(object obj)//提取的方法 22 { 23 for (int i = 0; i < 5; i++) 24 { 25 Console.WriteLine(i); 26 Thread.Sleep(1000);//1秒循环一次 27 } 28 (obj as Button).Enabled = true; 29 } }
线程