进程和线程
一、进程 Pcocess
引用命名空间:using System.Diagnostics;
步骤:
Process p = new Process();//实例化 ProcessStartInfo psi = new ProcessStartInfo(openFileDialog1.FileName);//获取要打开的文件的路径对象 p.StartInfo = psi;//把文件路径给进程 p.Start();//开启进程。不是立刻执行,要根据CPU的实际占有情况
二、线程
1 进程是主线程,线程去执行一段需要时间的代码,主线程不会被占用,程序就 不会出现假死状态了。
2 线程所在的命名空间:System.Threading;
3 Thread th = new Thread(方法名); 没有不要参数的构造函数,常用的为,1个参数,参数类型是委托类型,需要一个方法指向
4 程序默认不允许跨线程访问对象,关闭监控就可以了。构造函数中 Control.CheckForIllegalCrossThreadCalls = false;
5 程序默认所有的线程都为:前台线程 。将新开的线程变为后台线程:th.IsBackground = true;
6 停止线程:th.Abort();
7 实例
建立一个按钮,让他在“输出”里面执行三秒,点击按钮后,按钮失效,三秒后恢复使用。并且关闭窗体时,程序完全退出。
实例分析:
按按钮,失效,三秒后恢复:Button.Enable。这里面有一个线程传值。
关闭窗体时,程序完全退出:此线程是否为“前台线程”。
子线程不能动用主线程部件,于是需要修改CheckForIllegalCrossThreadCalls的属性
方法:
.创建窗体,只有一个Button。
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 WindowsFormsApplication4 { public partial class Form2 : Form { public Form2() { InitializeComponent(); Control.CheckForIllegalCrossThreadCalls = false;//程序默认不允许跨线程访问对象.设置为false就没事了。通俗点,关闭监控就可以了。 } private void button1_Click(object sender, EventArgs e) { Thread th = new Thread(aaa);//新建线程th。在th里面委托方法aaa,不用加()。 th.Start(button1);//把Button传到aaa(object b)方法中.. th.IsBackground = true;//程序默认所有的线程都为前台线程(即窗体关闭了,如果进程还未完事,此时进程还未完全关闭,直至任务完成)。设置成true时,窗体关闭了,线程就完全关闭了。 button1.Enabled = false; } private static void aaa(object b)//用线程执行方法,只能传一个参数,并且此参数必须是object类型。 { for (int i = 0; i < 3; i++) { Console.WriteLine(i); System.Threading.Thread.Sleep(1000); } ((Button)b).Enabled = true; } } }
完!!