C#-WinForm-进程、线程
进程:一个程序就是一个进程,也有可能一个程序需要多个进程来支持的情况,比如QQ
点击按钮打开记事本,静态方法
public partial class Form3 : Form { public Form3() { InitializeComponent(); } //点击打开记事本 private void button1_Click(object sender, EventArgs e) { Process.Start("notepad"); } }
引用新的命名空间:using System.Diagnostics; 新的类:Process;(李献策lxc)
==================================================
如何制作一个打开应用程序的程序?也可以实例化对象,来调用Start()普通方法
但调用普通方法之前,需要给StartInfo属性设置一个对象,来通知他要打开哪个进程(李献策lxc)
public partial class Form3 : Form { public Form3() { 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) { Process p = new Process();//将Process实例化 ProcessStartInfo psi = new ProcessStartInfo(textBox1.Text);//指定运行程序的路径名称 p.StartInfo = psi;//接收路径 p.Start();//运行程序 } }
=====================================================================
线程:
一个进程就像是一个公司,这个公司默认只有一个老板,老板叫做主线程,默认帮用户操作窗体,或者很快的其他操作
但如果执行长时间的操作,比如每隔一秒打印一个数字,此时主线程在执行循环,用户是无法操作窗体的
一个线程同一时间只能做一件事,程序一旦让他去执行一段需要时间的代码那么就会出现程序假死,失去控制
原因是:线程同一时间只能做一件事,而主线程是操作窗体控制的一旦被占用,那么窗体就没有人控制了(李献策lxc)
解决办法:
招一个员工帮老板干活
先把要执行的代码提取成一个方法,是一个完整的流程
点击按钮开始执行
public Form3() { InitializeComponent(); } //点击执行 private void button1_Click(object sender, EventArgs e) { //创建一个线程对象,告诉他要执行的哪个方法 Thread t = new Thread(aaa); //告诉他开始执行,不是立即开始,是cpu决定什么时候开始 t.Start(); } //要执行的程序代码,提取成方法 private static void aaa() { for (int i = 0; i < 10; i++) { Console.WriteLine(i); System.Threading.Thread.Sleep(1000); } } }
可以同时创建多个线程(李献策lxc)
问题:每次点击一个线程都会执行一次代码,如果连续点击会重复执行相同代码,可以设计在线程执行时按钮不可用,执行完按钮变得可用
线程需要执行一个方法,而这个方法允许有一个参数,并且这个参数必须是object类型
public partial class Form3 : Form { public Form3() { InitializeComponent(); } //点击执行 private void button1_Click(object sender, EventArgs e) { //创建一个线程对象,告诉他要执行的哪个方法 Thread t = new Thread(aaa); //告诉他开始执行,不是立即开始,是cpu决定什么时候开始 t.Start(sender); (sender as Button).Enabled = false; } //要执行的程序代码,提取成方法 private static void aaa(object bbb) { for (int i = 0; i < 10; i++) { Console.WriteLine(i); System.Threading.Thread.Sleep(1000); } (bbb as Button).Enabled = true; } }
程序默认不允许跨线程访问对象,因为监控开着,需要关闭监控
创建的线程是无法访问主线程的内容、控件的,需要结构函数中改变属性值即可(李献策lxc)
线程默认开启为前台线程,程序必须将所有的前台线程执行完毕后才会真正退出程序
解决办法:将线程变为后台线程,主窗体一关,后台线程全部关闭(李献策lxc)