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:\Users\Administrator\Desktop\a.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()的结果,可以在输出窗口中找到;


线程

在关闭程序时,需要释放窗体的资源,新创建的线程可能没有马上结束,仍然去访问主线程,主线程已关闭 ,出现异常:

解决办法:

关闭程序时,查看新创建的线程是否为null,若是,则不是,手动关闭 tte.Abort(); //终止线程

当线程a,a.Abort()后,不可以被b.Start():因为内存中不存在了


            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: 不捕获错误的调用



一个线程若是要执行的函数有参数,则要求这个参数是object类型;

若不满足,则传参数的时候应该在  线程名.start(参数)   -------这样传参数 

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();
            }
        
        }
    }


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一枚努力的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值