using System.Diagnostics;//进程的命名空间
一个应用程序可以理解为一个进程。进程的作用:为应用程序在内存中使用分配空间,通过进程可以直接操作应用程序。
//利用进程可以打开一些应用程序
Process.Start("calc"); //计算器 Process.Start("mspaint"); // 画图工具 Process.Start("notepad");// 记事本 Process.Start("iexplore","http://www.baidu.com");
static void Main(string[] args) { Process[] preo = Process.GetProcesses(); // 得到程序中所有正在运行的进程 ////进程类是一个非静态类,需要创建实例化 foreach (var item in preo){ Console.WriteLine(item); item.Kill(); //杀死进程 } //通过进程打开指定的文件 //创建一个进程实例 ProcessStartInfo ps = new ProcessStartInfo(@"C:UsersAdministratorDesktopa.txt");//打开一个文件,只是用来封装,无法打开,需要下面创建进程 // 创建 进程对象 Process p = new Process(); p.StartInfo=ps;//方法:打开一个实例 p.Start(); Console.ReadKey(); } }
Process.Start(): 类名.start() 说明调用的是静态方法;
Process p=new Process(); p.Start(); 对象.Start() 利用对象调用的方法,非静态方法。这两个不是一个方法
WINform窗体中无法看到Console,WriteLine()的结果,可以在输出窗口中找到;
<pre code_snippet_id="2441306" snippet_file_name="blog_20170609_3_2225294" name="code" class="csharp"> Thread.CurrentThread:获得当前的线程引用 Thread.sleep(3000); // 休眠3秒,后面一毫秒为单位 public void add() { int num = 0; for (int i = 0; i < 1000;i++ ) { num+=i; } } //使用方法:实例化Thread类,并传入一个指向线程所需要执行方法的委托(这时候线程已经产生,还没有运行) // 创建一个线程去做add() 这个方法 Thread tte = new Thread(add); //add为线程要执行的方法,线程产生 //线程分为两种:前台线程和后台线程,线程创建默认为前台线程。 //所有的 前台线程都关闭后,前台线程才被关闭;只要前台线程关闭后,后台线程自动结束 //设置线程为前台或后天线程 tte.IsBackground = true; //后台线程 // 标记这个线程就绪,可以随时被执行,何时去执行是由CPU决定的,不是人为控制的, tte.Start(); //线程之间不能操作 ,不允许跨线程访问,调用control,不让相互之间进行检查 Control.CheckForIllegalCrossThreadCalls=false;// control是所有控件的 基类---是否对错误事件的调用 // false: 不捕获错误的调用</pre><br> <pre></pre> <br> <p></p> <p><span style="font-size:18px; color:#ff0000">一个线程若是要执行的函数有参数</span>,则要求这个参数是object类型;</p> <p>若不满足,则传参数的时候应该在 线程名.start(参数) -------这样传参数 </p> <pre code_snippet_id="2441306" snippet_file_name="blog_20170609_3_1740491" name="code" class="csharp">public partial class Form1 : Form { public Form1() { InitializeComponent(); } bool bo=false; private void Form1_Load(object sender, EventArgs e) { Control.CheckForIllegalCrossThreadCalls = false; // 线程之间不可以操作 } private void button1_Click(object sender, EventArgs e) { if(bo==false){ bo = true; button1.Text = "停止"; Thread th = new Thread(playgame); th.IsBackground = true; // 后台线程 th.Start(); } else { bo = false; button1.Text = "开始"; Thread th = new Thread(playgame); th.Start(); } } public void playgame(){ // 这里若是有参的话,形参应该写成object a -------在函数里面再强制转换成子类型 ,如 string s=(string) a; Random rd = new Random(); while(bo){ label1.Text = rd.Next(1,10).ToString (); label2.Text = rd.Next(1, 10).ToString(); label3.Text = rd.Next(1, 10).ToString(); } } }</pre><br> <p><br> </p>
线程
在关闭程序时,需要释放窗体的资源,新创建的线程可能没有马上结束,仍然去访问主线程,主线程已关闭 ,出现异常:
解决办法:
关闭程序时,查看新创建的线程是否为null,若是,则不是,手动关闭 tte.Abort(); //终止线程
当线程a,a.Abort()后,不可以被b.Start():因为内存中不存在了