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();//直接将内存中的数据写入到磁盘
                }
            }
        }
 
 



posted @ 2012-10-29 22:30  许全通  阅读(292)  评论(0编辑  收藏  举报