zoukankan      html  css  js  c++  java
  • asp.net小记之——委托、线程、文件流

    2012年10月21日,星期日
     
    委托
        委托是一种强类型的指针!!
        MSDN:委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。
        委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的调用可以像其他任何方法一样,具有参数和返回值
    //约束的指向方法的签名,也就是一个强类型的指针
    public delegate int AddDel(int a ,int b);
    委托内部的构造
        1、_target——目标,如果是静态方法的话,那么就是一个null,如果是实例方法,那么就是实例名
        2、_methodPtr——指向方法的地址
        3、委托链数组
    匿名方法第一必须有delegate关键字,后面紧跟方法参数的签名,后面就是方法体;
    //委托使用升级:匿名方法
    //如果在程序中,,方法非常简单,并且不怎么重复使用,这就要考虑用匿名方法
    AddDel delNoneName = delegate(int a, int b) { return a + b; };
     
    lambda本质就是匿名函数,由匿名函数发展而来:
    //lambda 继续简化:
    //=> gosto lambda标记,前面是方法参数的签名,后面是方法体
    AddDel delLambda = (int a, int b) => { return a + b; };
    //继续简化lambda表达式,签名的委托已经约束了a,b的类型,所以可以省略,
    AddDel delLambda1 = (a, b) => { return a + b; };
    //继续简化,如果方法体只有一行代码,lambda会自动将表达式的值直接返回出去,
    AddDel delLambda2 = (a, b) => a + b;
     
    扩展方法:
    静态类、this、
     
    Action委托、
     
    FileStream文件流:
    句柄:句柄不是地址,只是一个标记
     
    进程:
     
     
    进程隔离不同应用程序的资源,进程其实就是一个执行流
    一个进程可以有多个线程。。
    轻量级的,线程指向一段代码。。但是不包含代码。。
    一个cpu只能执行一个线程,
    多核:双核4线程!!
    线程创建的时候:
        线程控制块,
     
    托管代码和非托管代码:
        
    一个进程里执行多个应用程序域,
    应用程序域:
        --内存分配的堆
        --代码安全的边界:多个域不影响
        --异常处理
    一个应用程序域可以跑多个线程!
    线程是可以穿透appdomain的
    线程在某一时刻只能属于一个appdomain
    一个appDomain同时运行多个线程
    产生一个线程的4步骤:
        1、编写产生线程所要执行的方法
        2、引用System.Threading命名空间
        3、实例化Thread类,并传入一个指向线程所要运行方法的委托(此时线程已经产生,但是还没有运行);
        4、调用Thread实例的Start方法,标记该线程可以被CPU执行了。。但是具体的执行时间由CPU决定;
     

    线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
    多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务(代码),也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

     
     
    应用程序域:
    //打印当前应用程序域
    //Console.WriteLine(AppDomain.CurrentDomain.FriendlyName);
    //创建一个应用程序域
    //AppDomain domainDemo = AppDomain.CreateDomain("ddd");
    //让当前应用程序域启动执行一个exe程序【可以执行一个exe,但是可以有多个程序集dll】
    //domainDemo.ExecuteAssembly("StreamDemo.exe");
     
    线程:
    //创建一个线程
    Thread threadDemo = new Thread(DemoThreadMethod);
    //设置当前线程的优先级
    threadDemo.Priority = ThreadPriority.Highest;
    //设置当前线程的类型
    //设置成后台线程:当前台线程都关闭后,当前进程就直接关闭;
    threadDemo.IsBackground = true
    //启动线程,其实并没有真正的启动,只是告诉操作系统我们准备好了。。你帮我分配线程执行此代码
    threadDemo.Start();
    Thread.Sleep(3000);
    //关闭线程
    threadDemo.Abort();
    //将当前执行此代码的线程阻塞,等待threadDemo线程执行完毕
    threadDemo.Join(1000);
    //给线程取个名字
    threadDemo.Name = "shit线程";
    Console.WriteLine("主线程执行完毕。。。。。。");
     
    带参数的线程:
    //指向一个带参数的方法。。参数类型必须是object
    Thread thread = new Thread(DemoParamets);
    //给线程指定的方法传递参数
    thread.Start("name");
    //*******************//
    static void DemoParamets(object data)
    {
    Console.WriteLine(data.ToString());
    }
     
    委托--匿名方法--Lambda表达式的发展历程:
                //委托的使用
                AddDel del = new AddDel(AddFunc);
                Console.WriteLine(del(4, 4));
                Console.ReadKey();
                Program p = new Program();
                AddDel del = new AddDel(p.DivFunc);
                Console.WriteLine(del(4, 4));
                Console.ReadKey();

                    ↓

                // 匿名方法
                //委托使用升级: 匿名方法
                //匿名方法:第一必须有delegate关键字,后面紧跟 方法参数的签名,后面是方法体。
                AddDel del = delegate(int a, int b) { return a + b; };
                AddStr delStr = delegate(string s1, string s2) { return s1 + s2; };
                Console.WriteLine(del(3, 3));
                Console.WriteLine(delStr("xqt", "sn"));
                Console.ReadKey();

                    ↓

                //Lambda表达式
                //Lambda表达式的本质就是匿名函数,由匿名函数发展而来
                //AddStr del = (string s1, string s2) => { return s1 + s2; };
                AddStr del = (s1, s2) => s1 + s2;
                Console.WriteLine(del("xqt", "sn"));
                AddDel delInt = (a, b) => a + b;
                Console.WriteLine(delInt(2, 2));
                Console.ReadKey();
     
    文件流复习:
     
    //读取文件
            private void btnReadFile_Click(object sender, EventArgs e)
            {
                OpenFileDialog ofd = new OpenFileDialog();
                if (ofd.ShowDialog() == DialogResult.OK)
                {
                    using (FileStream fs = File.OpenRead(ofd.FileName))
                    {
                        using (StreamReader reader = new StreamReader(fs, Encoding.Default))
                        {
                            while (!reader.EndOfStream)
                            {
                                string str = reader.ReadLine();
                                this.txtContent.AppendText(str);
                            }
                        }
                    }
                }
            }
     //保存文件
            private void btnSaveFile_Click(object sender, EventArgs e)
            {
                SaveFileDialog sfd = new SaveFileDialog();
                if (sfd.ShowDialog() == DialogResult.OK)
                {
                    using (StreamWriter writer = new StreamWriter(sfd.FileName))
                    {
                        writer.Write(this.txtContent.Text);
                        writer.Flush();//直接将内存中的数据写入到磁盘
                    }
                }
            }
     
     



  • 相关阅读:
    forward和redirect的区别
    转 jsp中 session的简单用法
    20_学生选课数据库SQL语句练习题1
    _学生选课数据库SQL语句练习题
    输入输出2
    接口提
    输入输出流3
    获取当前时间并显示在网页上
    简单的权限管理
    java关于时间
  • 原文地址:https://www.cnblogs.com/xuquantong/p/2745508.html
Copyright © 2011-2022 走看看