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

  • 相关阅读:
    Spark Steaming消费kafka数据条数变少问题
    intellij idea 搜索
    ZooKeeper shell
    linux 端口映射设置
    maxCompute odps 行转列
    dev stg prd 开发 测试 生产环境
    大数据之路
    MYSQL性能优化
    JavaScript学习笔记-setTimeout应用
    JavaScript学习笔记-函数
  • 原文地址:https://www.cnblogs.com/lzxboke/p/8414830.html
Copyright © 2020-2023  润新知