首页 > 代码库 > 进程 线程
进程 线程
1.进程:
最简单的用法
Process.Start("calc"); 里面放的是字符串
Process需要解析
弊端:有许多程序不知道它的运行名字到底是什么,如果写错了,就会出现程序崩溃错误
实例化进程类:Process p = new Process();
创建进程开启路径对象
ProcessStartInfo psi = new ProcessStartInfo(textBox1.Text);
进程类开启路径指向
p.StartInfo = psi;
启动进程,不是立刻开启,什么时候开启时由CPU决定
p.Start();
namespace 进程{ public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { openFileDialog1.Filter = "应用程序|*.exe"; DialogResult dr= openFileDialog1.ShowDialog(); if (dr == DialogResult.OK) { textBox1.Text = openFileDialog1.FileName; } } private void button2_Click(object sender, EventArgs e) { if (textBox1.Text == "") { MessageBox.Show("请先选择要打开的程序"); } else { try { //实例化进程类 Process p = new Process(); //创建进程开启路径对象 ProcessStartInfo psi = new ProcessStartInfo(textBox1.Text); //进程类开启路径指向 p.StartInfo = psi; //启动进程,不是立刻开启 什么时候开启 由CPU决定 p.Start(); } catch { MessageBox.Show("未找到程序,请确认路径是否正确"); } } } }}
2.线程
把进程想象成公司 公司只有一个老板,老板就是主线程,员工就是线程 ,
如果所有的事情都让老板干 会干不过来,所以 相当于 程序崩溃。
再找一些员工 就不会耽误主线程。
程序为什么会假死?因为主线程被占用了
线程去执行一段需要时间的代码,主线程不会被占用,程序就不会出现假死状态了
创建线程类,并使用委托,指定这个线程要执行的是哪个函数
Thread th = new Thread(aaa);
//开启线程执行功能,也不是立刻执行
th.Start();
问题一:
线程可以开启很多个,如果用户可以无限点击按钮,那么有可能会造成电脑CPU使用率过高
用线程执行方法,只能传一个参数,并且此参数必须是object类型
程序默认不允许跨线程访问对象
关闭监控就可以了
怎么关?
在构造函数中,实例化方法下面加上这句话:
Control.CheckForIllegalCrossThreadCalls = false;
问题二:
默认主窗体已经关闭,但是线程如果还未执行完工作内容,那么会默默的继续执行,直到执行完毕后才会将整个进程关闭
程序默认所有的线程都为:前台线程
namespace 线程{ public partial class Form1 : Form { public Form1() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false;//关闭监控,跨线程 } List<Thread> tlist = new List<Thread>(); private void button1_Click(object sender, EventArgs e) { string[] nums = new string[] { "13864464479", "1386445421", "13864412345", "13864453421", "13864478965", "18615151671" }; Thread th = new Thread(aaa); th.IsBackground = true;//设置为后台线程 th.Start(nums);//开启线程 tlist.Add(th); button1.Enabled = false; button2.Enabled = true; } private void aaa(object nums) { while (true) { string[] n = (string[])nums; Random r = new Random(); //非负随机数 返回int类型 int ind = r.Next(0, n.Length); label2.Text = n[ind]; Thread.Sleep(50);//停顿毫秒 } } private void button2_Click(object sender, EventArgs e) { foreach (Thread t in tlist) { t.Abort();//终止线程 } label2.Text = "18615151671"; //变回来 button1.Enabled = true; button2.Enabled = false; } }}
解决办法:将新开的线程变为后台线程
th.IsBackground = true;
3、总结:
1-线程所在的命名空间:System.Threading;
2-线程类:Thread th = new Thread(方法名);
没有不要参数的构造函数,常用的为,1个参数,参数类型是委托类型,需要一个方法指向
3-变为后台线程:th.IsBackground = true;
4-线程启动:th.Start();
如果要执行带参数的方法,那么这个方法的参数必须是object类型,参数传递的位置在Start方法的括号中
5-允许跨线程访问对象:
在构造函数的构造方法下面加上:
Control.CheckForIllegalCrossThreadCalls = false;
6-停止线程:th.Abort();
进程 线程