• 进程和线程


    进程:

    一个winfrom程序就是一个进程,一个qq就是一个进程,浏览器等等,一个进程里又包含很多线程

    namespace test {
        class Processtest {
            static void Main() {
                //获得计算机中所有正在运行的进程
                Process[] pros = Process.GetProcesses();
                foreach (var item in pros) {
                    Console.WriteLine(item);
                }
    
                //通过进程打开一些应用程序
                //Process.Start("calc");
                //Process.Start("mspaint");
                //Process.Start("notepad");
                //Process.Start("iexplore","http://www.baidu.com");
    
                //通过进程打开指定的文件
                //第一:创建进程对象
                Process p = new Process();
                ProcessStartInfo psi = new ProcessStartInfo(@"C:UsersAdministratorDesktop背包.docx");
                p.StartInfo = psi;
                p.Start();
                //每个进程都是由多个线程组成
            }
        }
    }

    前台线程和后台线程

    前台线程:只有所有的前台线程都关闭才能完成程序关闭

    后台线程:只要所有的前台线程都结束,后台线程自动结束

    默认情况下创建的线程都为前台线程

    namespace Controlstudy {
        public partial class ThreadFrm : Form {
            public ThreadFrm() {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e) {
                //Test();
                //创建一个线程去执行这个方法
                Thread th = new Thread(Test);
                //标记这个线程准备就绪了,可以随时被执行,cpu决定何时执行
                th.Start();
            }
            //主线程用于窗体服务,展示,拖拽,按钮点击等等
            //主线程都去干这个事了,窗体假死状态
            private void Test() {
                for (int i = 0; i < 10000; i++) {
                    Console.WriteLine(i);
                }
            }
        }
    }
    

      将线程设置为后台线程,前台线程一关,后台线程自动关闭

    namespace Controlstudy {
        public partial class ThreadFrm : Form {
            public ThreadFrm() {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e) {
                //Test();
                //创建一个线程去执行这个方法
                Thread th = new Thread(Test);
                //将线程设置为后台线程,前台线程一关,后台线程自动关闭
                th.IsBackground = true;
                //标记这个线程准备就绪了,可以随时被执行,cpu决定何时执行
                th.Start();
            }
            //主线程用于窗体服务,展示,拖拽,按钮点击等等
            //主线程都去干这个事了,窗体假死状态
            private void Test() {
                for (int i = 0; i < 10000; i++) {
                    Console.WriteLine(i);
                }
            }
        }
    }
    

    跨线程访问报错实例

    namespace Controlstudy {
        public partial class ThreadFrm : Form {
            public ThreadFrm() {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e) {
                //Test();
                //创建一个线程去执行这个方法
                Thread th = new Thread(Test2);
                //将线程设置为后台线程,前台线程一关,后台线程自动关闭
                th.IsBackground = true;
                //标记这个线程准备就绪了,可以随时被执行,cpu决定何时执行
                th.Start();
            }
            //主线程用于窗体服务,控件渲染等,展示,拖拽,按钮点击等等
            //主线程都去干这个事了,窗体假死状态
            private void Test() {
                for (int i = 0; i < 10000; i++) {
                    Console.WriteLine(i);
                }
            }
            //跨线程访问报错
            private void Test2() {
                for (int i = 0; i < 10000; i++) {
                    //textbox1为主线程创建的
                    textBox1.Text = i.ToString();
                }
            }
        }
    }
    

      手动关闭线程

    namespace Controlstudy {
        public partial class ThreadFrm : Form {
            public ThreadFrm() {
                InitializeComponent();
            }
            Thread th;
            private void button1_Click(object sender, EventArgs e) {
                //Test();
                //创建一个线程去执行这个方法
                th = new Thread(Test2);
                //将线程设置为后台线程,前台线程一关,后台线程自动关闭
                th.IsBackground = true;
                //标记这个线程准备就绪了,可以随时被执行,cpu决定何时执行
                th.Start();
            }
            //主线程用于窗体服务,控件渲染等,展示,拖拽,按钮点击等等
            //主线程都去干这个事了,窗体假死状态
            private void Test() {
                for (int i = 0; i < 10000; i++) {
                    Console.WriteLine(i);
                }
            }
            //跨线程访问报错
            private void Test2() {
                for (int i = 0; i < 10000; i++) {
                    //textbox1为主线程创建的
                    textBox1.Text = i.ToString();
                }
            }
    
            private void ThreadFrm_Load(object sender, EventArgs e) {
                //取消跨线程访问检查
                Control.CheckForIllegalCrossThreadCalls = false;
            }
    
            private void ThreadFrm_FormClosing(object sender, FormClosingEventArgs e) {
                //当点击关闭窗体的时候,判断新线程是否为null,如果不为null,则手动关闭掉
                if (th != null) {
                    th.Abort();
                }
            }
        }
    }
  • 相关阅读:
    一键登录功能实现
    weblogic.xml中的虚拟目录的配置
    oracle定时器在项目中的应用
    redis主从架构的搭建
    oracle数据库中的trim不起作用
    datetimepicker日期框选择后,无法触发bootstrapValidator
    付出总有收获
    失落
    开启产品之路
    Nodejs入门级
  • 原文地址:https://www.cnblogs.com/as3lib/p/6245563.html
Copyright © 2020-2023  润新知