C# 进程与线程 操作

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():因为内存中不存在了

原文地址:https://www.cnblogs.com/lzxboke/p/8414830.html