进程、线程与应用程序域
进程:
进程是操作系统级别的一个基本概念,可以将其简单的理解为“正在运行的程序”。
进程之间是相互独立的,进程之间不能直接进行通信。
从程序实现的角度来说,将一个进程划分成若干个独立的执行流,每个独立的执行流就是线程。
一个进程中,既可以包括一个线程,也可以包括多个线程。
C#中提供了一个System.Environment类,提供了一些方法,比如:
1 StringBuilder sb = new StringBuilder(); 2 sb.AppendLine("本机处理器数:" + Environment.ProcessorCount); 3 sb.AppendLine("是否为64位操作系统:" + Environment.Is64BitOperatingSystem); 4 sb.AppendLine("当前进程是否为64位进程:" + Environment.Is64BitProcess); 5 sb.AppendFormat("当前进程占用的物理内存:{0:#.##}MB", Environment.WorkingSet / 1024.0 / 1024.0); 6 MessageBox.Show(sb.ToString());
C#的System.Diagnostics命名空间下的Process类提供了在操作系统级别对进程进行管理的各种属性和方法,比如:
1 Process process = new Process(); 2 process.StartInfo.FileName = "Notepad.exe"; 3 process.StartInfo.Arguments = "Test1.txt"; 4 process.StartInfo.WindowStyle = ProcessWindowStyle.Normal; 5 process.Start();
Kill和CloseMainWindow。
其中,如果关闭没有主窗口的程序,只能选择使用Kill。Kill是强制关闭程序,而ColseMainWindow比较的温和。
当我们使用Kill方法之后,还需要调用WaitForExit方法来等待程序是否已经退出,或者用HasExited检查进程是否已经退出。
而CloseMainWindow是有返回值的,返回True代表关闭窗口成功。
HasExited
用于线程是否已经终止。
WaitForInputIdle
他可以使Process等待关联进程进入空闲状态,这个状态很有用,比如某个应用程序需要等待启动的进程完成创建其主窗口,然后才能与该窗口通信。这种情况下,就需要调用WaitForInputIdle方法。
ExitCode和ExitTime
ExitCode获取关联程序结束时的返回值,ExitCode获得关联进程退出时间。
GetProcess和GetProcessByName
1 Process[] processes = Process.GetProcesses(); //获取本机所有进程信息 2 Process[] processes = Process.GetProcesses("192.168.0.1"); //获取远程计算机所有进程信息 3 Process[] processes = Process.GetProcessesByName("Notepad");//不要带拓展名,获取名字是Notepad的所有进程 4 Process[] processes = Process.GetProcessesByName("Notepad", "192.168.0.1");//获取远程计算机上名字是Notepad的所有进程
线程:
主线程用于执行Main方法中的代码,当Main方法返回时,主线程也自动终止。除了主线程外,其他线程都称为辅助线程。
一个线程要么是前台线程,要么是后台线程。两者的区别是:后台线程不会影响进程的终止,前台线程则会影响线程的终止。
用Thread对象创建的线程默认的都是前台线程,在托管线程池中执行的线程默认都是后台线程。
有两个属性IsBackground,指示是否为后台线程。IsThreadPoolground,指示是否为线程池中的线程。
用法示例:
MyData state = new MyData { Message = "b", Info = "\n线程 2 已终止" };//参数 Thread thread2 = new Thread(c.MyMethod);//托管c.MyMethod方法的线程 thread2.IsBackground = true; //设置为后台线程 thread2.Start(state); //执行线程
MyData state = new MyData { Message = "c", Info = "\n线程 3 已终止" };//参数 ThreadPool.QueueUserWorkItem(new WaitCallback(c.MyMethod), state);
应用程序域:
每个应用程序域都用System命名空间下的一个AppDomain对象来管理。
利用应用程序域可在当前进程中动态加载或卸载一个或多个程序组件(.exe文件或.dll文件),并能通过反射查看和调用程序集中的字段、属性、方法等。
在一个主线程中,可包含一个或者多个应用程序域。
Assembly程序集,有Load方法,用于加载exe或者dll文件。比如:
Assembly a1 = Assembly.Load("MyConsoleApp"); //加载程序集
System命名空间下有一个Type类,对反射起着核心的作用,比如:
Type t1 = a1.GetType("MyConsoleApp.MyClass"); //获得程序集里面的对象
应用如下:
Assembly a2 = Assembly.Load("MyClassLibrary"); Type t2 = a2.GetType("MyClassLibrary.Class1"); sb.AppendLine("\n执行MyClassLibrary.dll中Class1对象的MyMethod方法:"); MethodInfo myMethod2 = t2.GetMethod("MyMethod"); object obj2 = Activator.CreateInstance(t2); sb.AppendLine("结果为:" + myMethod2.Invoke(obj2, new object[] { 3, 5 })); //参数列表3,5 textBlock.Text = sb.ToString();

浙公网安备 33010602011771号