进程,线程,递归调用找所有文件的案例,反射

来源:互联网 发布:深圳中原大数据 编辑:程序博客网 时间:2024/06/03 12:21

进程

当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由多个线程所组成的。

**************************

Process:提供对本地和远程进程的访问并使您能够启动和停止本地系统进程

获取所有的进程

Process[] pros = Process.GetProcesses();

返回一个确定的某个进程的标识符

Process pro = Process.GetProcessById(7876);

关闭继承ID号为7876的进程

pro.Kill();

Start:通过指定文档或应用程序文件的名称来启动进程资源,并将资源与新的Process组件关联;

打开某个目录下的文件

Process.Start(@"C:\Users\yy\Desktop\考试.txt");

使用IE浏览器打开Baidu的首页

Process.Start("iexplore","http://www.baidu.com");

启动关闭计算机的进程

Process.Start("shutdown","-s -t 0");

线程

线程特性,多线程会以人感受不到的速度交替工作

什么是线程?

线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。

什么是多线程?

多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

多线程的好处:

可以提高 CPU的利用率。在多线程程序中,一个线程必须等待的时候, CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。

多线程的不利方面:

线程也是程序,所以线程需要占用内存,线程越多占用内存也越多; 多线程需要协调和管理,所以需要 CPU时间跟踪线程; 线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;线程太多会导致控制太复杂,最终可能造成很多Bug

Thread创建并控制线程,设置其优先级并获取其状态;

CurrentThread:获取当前正在运行的线程;

Name:获取或设置线程的名称

Thread.CurrentThread.Name = "MainThread";

 

实例化一个线程

Thread t = new Thread(Test01);

Priority获取或设置一个值,该值指示线程调度优先级;

ThreadPriority指定Thread的调度优先级

t.Priority = ThreadPriority.Highest;

Start将线程运行

t.Start();

阻塞其他的线程  直到此线程结束后在执行其他的线程

t.Join();

Abort用于终止线程

t.Abort();

********如果JoinAbort之前,就会打完再终止,如果AbortJoin之前,将打不出来。********

Sleep将当前线程挂起指定的时间(10001S

Thread.Sleep(1000);

*****Console.Clear();清除控制台的信息*****

此案例将60以每秒倒数计时的方式执行

for (int i = 0; i < 60; i++)

            {

                Console.WriteLine(60 - i);

                Thread.Sleep(1000);

                Console.Clear();

            }

三个线程打印10个数案例(线程交替进行代表案例)

static int num = 0;

        static void Main(string[] args)

        {

            for (int i = 0; i < 3; i++)

            {

                Thread th = new Thread(Test);

                th.Start();

                th.Name = "Thread" + i;

            }

        }

        static void Test()

        {

            object o = new object();

            lock (o)

            {

                while (num<10)

                {

                    num++;

                    Console.WriteLine(num +"  "+Thread.CurrentThread.Name);

                }

            }

*********************额外知识**********************

递归调用找所有文件的案例

  static void Main(string[] args)

        {

            string path = @"D:\FileTest";

            GetAllFiles(path);

            Console.WriteLine("--------------------");

            GetDirectories(path);

        }

        static void GetAllFiles(string path)

        {

            string[] files =  Directory.GetFiles(path);

            foreach (var itemin files)

            {

                Console.WriteLine(item);

            }

        }

        static void GetDirectories(string path)

        {

            string[] directies = Directory.GetDirectories(path);

            foreach (var itemin directies)

            {

                GetDirectories(item);

                GetAllFiles(item);

            }

        }

反射

Type:表明类型声明

Type type = typeof(int);

打印int类型所在程序集的信息

Console.WriteLine(type.Assembly);

是否是抽象类

Console.WriteLine(type.IsAbstract);

是否是类

Console.WriteLine(type.IsClass);

是否是数组

Console.WriteLine(type.IsArray);

int类型的命名空间

Console.WriteLine(type.Namespace);

int类型的类名

Console.WriteLine(type.Name);

int类型的全称  命名空间和类名

Console.WriteLine(type.FullName);

int类型的基类  值类型的父类都ValueType

Console.WriteLine(type.BaseType);

得到基类获取指定字符串的类型

GetType()获取当前实例的类型

ype t = Type.GetType("反射1.Student");

Console.WriteLine(t.Name);获取当前成员的名称Student

Console.WriteLine(t.BaseType);获取当前类型直接从中继承的类型System.Object

Assembly表示一个程序集

GetAssembly获取指定类当前加载的程序集

Assembly assem = Assembly.GetAssembly(t);

程序集的全称

Console.WriteLine(assem.FullName);

程序集的程序入口  

Console.WriteLine(assem.EntryPoint);

根据命名空间和类名  实例化一个对象

object studentObj = assem.CreateInstance("反射1.Student");

根据对象获取类中的信息字段 属性 方法  

Type studentType = studentObj.GetType();

获取类中的私有字段

FieldInfo发现字段属性并提供对字段元数据的访问权

GetFields当在派生类中重写时,使用指定绑定约束,搜索为当前Type定义的字段

BindingFlags指定控制绑定和由反射执行的成员和类型搜索方法的标志

NonPublic指定非公共成员将包括在搜索中

Instance指定实例成员将包括在搜索中

FieldInfo[] fieldInfoArr = studentType.GetFields(BindingFlags.NonPublic |BindingFlags.Instance);

获取类中的属性

PropertyInfo发现属性(Property)的属性(Attribute)并提供对属性(Property)元数据的访问

GetProperties返回当前Type的所有公共属性

PropertyInfo[] propInfoArr = studentType.GetProperties();

获取到类中的方法  包含父类中的虚方法

MethodInfo发现方法的属性并提供对方法元数据的访问

GetMethods返回当前Type的所有公共方法

MethodInfo[] methodinfoArr = studentType.GetMethods();

反射获取属性和方法的案例,通过反射为类赋值,并调用类中方法

PropertyInfo propName = studentType.GetProperty("Name");

propName.SetValue(studentObj,"Jack");

PropertyInfo propAge = studentType.GetProperty("Age");

propAge.SetValue(studentObj,20);

PropertyInfo propGender = studentType.GetProperty("Gender");

propGender.SetValue(studentObj, '');

MethodInfo methodShow = studentType.GetMethod("ShowInfoMation");

methodShow.Invoke( studentObj,null);

通过反射配置文件(请详细参照参考代码)

注:1使用右键为Input生成dll文件。2使用右键属性更改Input程序集名称和命名空间。3.在相对路径Config.txt中写上代码需要的文本。

****************************************************

下面案例为简单的解析dll文件并执行其中方法的实例。

Invoke:使用指定的参数调用当前实例所表示的方法或构造函数。

  Assembly assem = Assembly.LoadFile(path);

            Type[] ts = assem.GetTypes();

            object obj = assem.CreateInstance("Aniaml.Lion");

            Type t = obj.GetType();

            MethodInfo[] methodInfoArr = t.GetMethods();

            MethodInfo talk = t.GetMethod("Talk");

            talk.Invoke(obj,new object[] { });

*****************************************************

            MethodInfo show = t.GetMethod("Show");

            show.Invoke(obj,new object[] {"李世民"});


阅读全文
0 0