winform进程、线程、TreeView递归加载

进程:

一般来说,一个程序就是一个进程,不过也有一个程序需要多个进程支持的情况。

 

进程所使用的类:Process

所需命名空间:System.Diagnostics;

可以通过进行来开启计算机上现有的程序:

 

1、使用静态方法Start();但必须要知道进程名

2、也可以实例化对象,来调用Start()普通方法,但调用普通方法之前需要给

StartInfo属性设置一个对象,来通知它要打开的是哪个进程(绝对路径)

例:点击按钮选择文件路径,并显示出来,点击第二个按钮可打开此程序

private void button1_Click(object sender, EventArgs e)
        {
            Process p = new Process();
            ProcessStartInfo psi = new ProcessStartInfo(textBox1.Text.Trim());

            p.StartInfo = psi;

            p.Start();

        }

        private void button2_Click(object sender, EventArgs e)
        {
            openFileDialog1.Filter = "应用程序|*.exe";

            DialogResult dr = openFileDialog1.ShowDialog();

            if (dr == DialogResult.OK)
            {
                textBox1.Text = openFileDialog1.FileName;
            }

        }
进程

线程:

线程是程序中一个单一的顺序控制流程。一个程序只有一个主线程,winform中主线程就是控制窗体本身操作的,

如果要让它去执行一个需要一定时间才能完成的代码,那此时窗体会卡住,出现假死状态,为了避免这种情况,就需要用到多线程。

创建线程对象:Thread

线程需要执行一个方法,而这个方法允许有一个参数,并且这个参数必须是object类型的

程序默认不允许跨线程访问对象,如果仍想访问,需要在构造函数中写上Control.CheckForIllegalCrossThreadCalls = false;

线程默认开启为前台线程,程序必须将所有的前台线程执行完毕后才会真正退出程序,所以一般都会将线程改为后台线程th.IsBackground = true;

注:想让线程去执行的功能必须封装成方法

例:

public Form2()
        {
            InitializeComponent();

            Control.CheckForIllegalCrossThreadCalls = false;

        }

        private void button1_Click(object sender, EventArgs e)
        {
            //创建一个线程对象,告诉它要执行的是哪一个方法
            Thread th = new Thread(aaa);

            //设置后台线程
            th.IsBackground = true;

            //准备好了,开始执行,不是立即开始,CPU决定什么时候开始
            th.Start(sender);
            (sender as Button).Enabled = false;
        }

        private static void aaa(object bbb)
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine(i);
                Thread.Sleep(1000);
            }
            (bbb as Button).Enabled = true;

        }
线程

TreeView递归加载:

递归就是在方法里面调用这个方法本身,但由于执行效率不高,不是很常用

Tag属性:每个控件都有,是用户自定义内容,方便程序读取某个对象使用

例:利用递归给TreeView加载中国的地区,此处由于递归中重复开启关闭数据库查询非常卡,所以只查询全部,使用Lambda表达式操作泛型集合实现

public Form1()
        {
            InitializeComponent();

            AllList = new ChinaData().Select();

            TreeNode tn1 = new TreeNode("中国");
            tn1.Tag = "0001";

            NodesBind(tn1);

            treeView1.Nodes.Add(tn1);

        }


        public void NodesBind(TreeNode tn)
        {
            //lambda 表达式   
            List<China> clist = AllList.Where(r => r.ParentAreaCode == tn.Tag.ToString()).ToList();

            foreach (China c in clist)
            {
                TreeNode tnn = new TreeNode(c.AreaName);
                tnn.Tag = c.AreaCode;

                NodesBind(tnn);

                tn.Nodes.Add(tnn);
            }
        }
递归加载

 

转载于:https://www.cnblogs.com/wt627939556/p/6171187.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值