进程(process):

      1 进程对象名: proces (类)引用需对其进行解析;

      2 应用进程:

          1)  直接打开进程,代码如下:

                       proces.start();          //括号里加要打开默认英文的中文名;

          2)   浏览文件夹并在textbox1里边显示路径名称并打开里边程序

                       界面如下:

              

         (1) 先打开文件夹并将路径显示在textbox里边;代码如下

            

 private void button2_Click(object sender, EventArgs e)
        {
            //
            DialogResult dr = openFileDialog1.ShowDialog(); 
            if (dr == DialogResult.OK)
            {
                textBox1.Text = openFileDialog1.FileName;

            }

        }

   (2)打开找到的程序;代码如下:

         

 private void button1_Click(object sender, EventArgs e)
        {
            Process p = new Process();        //创建新进程
            ProcessStartInfo ps = new ProcessStartInfo(textBox1.Text);  // 要打开的对象是textbox1里显示的路径
            p.StartInfo = ps;
            p.Start();                              //打开
        }

     3) 用默认浏览器直接打开网址: 

            代码: process.start ("http://www.baidu.com"     );

    4) 清空进程:(慎重,清空有可能导致电脑无法操作)

           代码:

 private void button4_Click(object sender, EventArgs e)
        {
            Process[] ps = Process.GetProcesses();  //设置进程新数组ps,里边的内容为从电脑获取的进程
            foreach (Process p in ps)               //将里边的进程遍历并杀死
            {

                p.Kill();                           
            }
        }

   线程(thread):

          1   分类:   1)主线程:当一个程序启动时,就有一个进程被操作系统创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程。主线程的重要性体现在两方面:                                    1.是产生其他子线程的线程;2.通常它必须最后完成执行比如执行各种关闭动作。

                             2)子线程:(1)前台线程:前台线程与主线程平级并不随着主线程关闭而关闭。

                                                 (2)后台线程:线程名字.IsBackground = true;         //是不是后台进程(true,fasle)若是则随着主线程关闭而关闭

          2  创建新线程及应用

         private void button5_Click(object sender, EventArgs e)
       {
            Thread th = new Thread(test1);  //新建线程 并调用方法  (是前台线程与主线程平级并不随着主线程关闭而关闭)
            th.IsBackground = true;         //是不是后台进程(true,fasle)若是则随着主线程关闭而关闭
            th.Start();                                  //开始执行         
            
       }
            public void test1()    //方法是循环,显示并间隔两秒执行
         {
                for (int a = 0; a < 10; a++)
             {
                Console.WriteLine(a);   // 循环
                Thread.Sleep(2000);     //间隔几秒
}
}

 

   3  如何用线程沾满CPU     原理:1)将进程改为前台进程    目的:关闭程序后,仍执行此进程

                                                      2)创建无限个进程,调用无线个方法    目的 :占满cpu

                                           代码如下:

     private void button5_Click(object sender, EventArgs e)
       {
            while (true)
            {
                Thread th = new Thread(test1);  //新建线程 并调用方法  (是前台线程与主线程平级并不随着主线程关闭而关闭)
                th.Start();                     //开始执行         
            }
       }
            public void test1()    //方法是循环,显示并间隔两秒执行
         {
                for (int a = 10; a > 10; a++)
             {
                Console.WriteLine(a);   // 循环
                Thread.Sleep(2000);     //间隔几秒

             }
         }

   创建抽奖游戏:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace 记事本
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;  //允许线程访问
        }

        Thread th;
        private void button1_Click(object sender, EventArgs e)
        {
            th = new Thread(lucky);                        // 创建新线程并调用lucky方法
            th.IsBackground = true;                        //是后台应用
            th.Start();                                    //点击开始

        }
        public void lucky()                              //创建一个没有返回类型的方法
        {
            string[] name = new string[] { "李先生 18765627280", "王先生  18555219598", "刘先生  15899882322", "何先生 18799885858" }; //创建抽奖名单数组
            while (true)
            {
                Random r = new Random();           // 创建新随机数
                int a = r.Next(0, name.Length);    //随机数的选择在0,与数组长度之间
                textBox1.Text = name[a];          // 文本框显示的是数组索引的那个
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (th != null)   //如果线程不为空
            {

                th.Abort();   //点击停止
                
            }
        }

 3 递归:

        应用:分组,多级菜单大多用treeview,如果不知道下边有多少级就用递归。

            1) 创建节点结构,代码如下:

            TreeNode tn1 = new TreeNode("节点1"); // 创建名为节点1的节点
            TreeNode tn1_1 = new TreeNode("节点1_1");//创建名为节点1_1的节点
            tn1.Nodes.Add(tn1_1);                    //将节点1_1加入tn1作为节点1的节点
            TreeNode tn2 = new TreeNode("节点二");   // 创建名为节点2的节点
            TreeNode tn3 = new TreeNode("节点三");   // 创建名为节点3的节点
            treeView1.Nodes.Add(tn1);                
            treeView1.Nodes.Add(tn2);
            treeView1.Nodes.Add(tn3);                //将创建的节点1,2,3放入treeview1的集合里

        则:显示为:

                                                                        

      数据绑定:在文件夹 App_Code 下创建表的实类————再创建数据访问类————在数据访问类下写方法查询全表的内容————再用集合把表的内容取出来——

 

     递归方法:

                     

   private void button2_Click(object sender, EventArgs e)
        {
            databind("0001", treeView1.Nodes);              // 给方法的编号为0001(国家编号),然后把取出的集合放进treeviews.nodes里
        }
        public void databind(string code, TreeNodeCollection tnc )  // 给方法一个编号和编号的集合
        {
            foreach (ChinaTown cs in list)                        // 将取出来的表集合 list遍历出来
            {
                if (cs.ParentAreaCode == 0001)                     // 如果表里的父级编号ParentAreaCode是0001
                {
                    TreeNode tn = new TreeNode(cs.AreaName);       // 节点tn 就是表里父级编号是001的名字
                    databind(cs.areacode, tn.nodes);               //递归
                   tnc.Add(tn);                                  //把tn的数据加在treeview集合里

                }
            }
        }