在C#的网络编程中,进程和线程是必备的基础知识,同时也是一个重点,所以我们要好好的掌握一下。

一:概念

首先我们要知道什么是”进程”,什么是“线程”,好,查一下baike。

进程:是一个具有一定独立功能的程序关于某个数据集合的一次活动。它是操作系统动态执行的基本单元,

在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

线程:是"进程"中某个单一顺序的控制流。

关于这两个概念,大家稍微有个印象就行了,防止以后被面试官问到。

二:进程

framework里面对“进程”的基本操作的封装还是蛮好的,能够满足我们实际开发中的基本应用。

<1> 获取进程信息

framework中给我们获取进程的方式还是蛮多的,即可以按照Name获取,也可以按照ID获取,也可以获取本地和远程的进程信息。

1    public Process[] GetProcess(string ip = "")2         {3             if (string.IsNullOrEmpty(ip))4                 return Process.GetProcesses();5 6             return Process.GetProcesses(ip);7         }

 Process process = Process.GetProcessById(Convert.ToInt32(processID));

<2> 启动和停止进程

其实这个也没啥好说的,不过有一个注意点就是Process中的"kill"和"CloseMainWindow"的区别。

windowMainWindow:  当我们打开的Process是一个有界面的应用程序时,推荐使用此方法,它相当于点击了应用程序的关闭按钮,是一个有序的

终止应用程序的操作,而不像kill那么暴力。

kill:                         根据这个单词估计大家都知道啥意思吧,它的作用就是强制关闭我们打开的Process,往往会造成就是我们数据的丢失,所以

说在万不得已的情况下不要使用kill,当然在无图形界面的应用程序中,kill是唯一能够结束Process的一个策略。

<3> 进程操作的一个演示

  1    public class ProgessHelper  2     {  3         //主操作流程  4         public static void MainProcess()  5         {  6             ProgessHelper helper = new ProgessHelper();  7   8             var result = helper.GetProcess();  9  10             helper.ShowProcess(result.Take(10).ToArray()); 11  12             Console.Write("\n请输入您要查看的进程:"); 13  14             helper.ShowProcessSingle(Console.ReadLine()); 15  16             Console.Write("\n请输入您要开启的程序:\t"); 17  18             var name = helper.StartProcess(Console.ReadLine()); 19  20  21             Console.WriteLine("程序已经开启,是否关闭?(0,1)"); 22  23             if (Console.ReadLine() == "1") 24             { 25                 helper.StopProcess(name); 26  27                 Console.WriteLine("关闭成功。"); 28             } 29         } 30  31         #region 获取进程 32         /// <summary> 33 /// 获取进程 34 /// </summary> 35 /// <param name="ip"></param> 36 /// <returns></returns> 37         public Process[] GetProcess(string ip = "") 38         { 39             if (string.IsNullOrEmpty(ip)) 40                 return Process.GetProcesses(); 41  42             return Process.GetProcesses(ip); 43         } 44         #endregion 45  46         #region 查看进程 47         /// <summary> 48 /// 查看进程 49 /// </summary> 50 /// <param name="process"></param> 51         public void ShowProcess(Process[] process) 52         { 53             Console.WriteLine("进程ID\t进程名称\t物理内存\t\t启动时间\t文件名"); 54  55             foreach (var p in process) 56             { 57                 try 58                 { 59                     Console.WriteLine("{0}\t{1}\t{2}M\t\t{3}\t{4}", p.Id, p.ProcessName.Trim(), p.WorkingSet64 / 1024.0f / 1024.0f, 60                                                                          p.StartTime, p.MainModule.FileName); 61                 } 62                 catch (Exception ex) 63                 { 64                     Console.WriteLine(ex.Message); 65                 } 66             } 67         } 68         #endregion 69  70         #region 根据ID查看指定的进程 71         /// <summary> 72 /// 根据ID查看指定的进程 73 /// </summary> 74 /// <param name="processID"></param> 75         public void ShowProcessSingle(string processID) 76         { 77             Process process = Process.GetProcessById(Convert.ToInt32(processID)); 78  79             Console.WriteLine("\n\n您要查看的进程详细信息如下:\n"); 80  81             try 82             { 83                 var module = process.MainModule; 84  85                 Console.WriteLine("文件名:{0}\n版本{1}\n描叙{2}\n语言:{3}", module.FileName, module.FileVersionInfo.FileVersion, 86                                                                            module.FileVersionInfo.FileDescription, 87                                                                            module.FileVersionInfo.Language); 88             } 89             catch (Exception e) 90             { 91                 Console.WriteLine(e.Message); 92             } 93         } 94         #endregion 95  96         #region 进程开启 97         /// <summary> 98 /// 进程开启 99 /// </summary>100 /// <param name="fileName"></param>101 /// <returns></returns>102         public string StartProcess(string fileName)103         {104             Process process = new Process();105 106             process.StartInfo = new ProcessStartInfo(fileName);107 108             process.Start();109 110             return process.ProcessName;111         }112         #endregion113 114         #region 终止进程115         /// <summary>116 /// 终止进程117 /// </summary>118 /// <param name="name"></param>119         public void StopProcess(string name)120         {121             var process = Process.GetProcessesByName(name).FirstOrDefault();122 123             try124             {125                 process.CloseMainWindow();126             }127             catch (Exception ex)128             {129                 Console.WriteLine(ex.Message);130             }131         }132         #endregion133     }

快看,PPTV真的被我打开了,嗯,8错,Process还是蛮好玩的。

这里要注意一点:

我们在59行中加上了Try Catch,这是因为每个Process都有一个MainModule属性,但并不是每一个MainModule都能被C#获取,

如会出现如下的“拒绝访问”。

三: 线程

同样线程的相关操作也已经被framework里面的Thread完美的封装,大大简化了我们的工作量,常用的操作如下

<1> 启动线程。

<2> 终止线程。

<3> 暂停线程。

<4> 合并线程。

这个要解释一下,比如:t1线程在执行过程中需要等待t2执行完才能继续执行,此时我们就要将t2合并到t1中去,也就是在

t1的代码块中写上t2.Join()即可。同样Join中也可以加上等待t2执行的时间,不管t2是否执行完毕。

<5> 线程同步

估计大家也知道,多线程解决了系统的吞吐量和响应时间,同时也给我们留下了比如死锁,资源争用等问题,那么我们如何

解决这些问题呢?呵呵,Anders Hejlsberg 这位老前辈已经给我们提供了很多的实现同步线程的类,比如Mutex,Monitor,

Interlocked和AutoResetEvent,当然在实际应用中,我们还是喜欢使用简化版的lock,因为这玩意能够使编程简化,同时使

程序看起来简洁明了。

<6>  同样我也举个例子

 1 public class ThreadHelper 2     { 3         public static void MainThread() 4         { 5  6             ThreadHelper helper = new ThreadHelper(100); 7  8             Thread[] thread = new Thread[20]; 9 10             for (int i = 0; i < 20; i++)11             {12                 thread[i] = new Thread(helper.DoTransactions);13 14                 thread[i].Name = "线程" + i;15 16             }17 18             foreach (var single in thread)19             {20                 single.Start();21             }22         }23 24         int balance;25 26         object obj = new object();27 28         public ThreadHelper(int balance)29         {30             this.balance = balance;31         }32 33         #region 取款操作34         /// <summary>35 /// 取款操作36 /// </summary>37 /// <param name="amount"></param>38         public void WithDraw(int amount)39         {40             lock (obj)41             {42                 if (balance <= 0)43                 {44                     Console.WriteLine("哈哈,已经取完了");45                     return;46                 }47 48                 if (balance >= amount)49                 {50                     Console.WriteLine("取款前余额:{0},取款:{1},还剩余额:{2}", balance, amount, balance - amount);51                     balance = balance - amount;52                 }53                 else54                 {55                     Console.WriteLine("取款前余额:{0},取款:{1},还剩余额:{2}", balance, balance, balance = 0);56                 }57             }58         }59         #endregion60 61         #region 自动取款操作62         /// <summary>63 /// 自动取款操作64 /// </summary>65         public void DoTransactions(object obj)66         {67             int random = new Random().Next(4, 10);68 69             Thread.Sleep(5000);70 71             WithDraw(random);72         }73         #endregion74     }

当我们加上lock的时候一切正常,但是当我们把lock去掉的时候,看看线程们会有“争用资源”的现象吗?,在下图中可以看到,出现了如下的现象,

当然这不是我想看到的结果,如果在实际应用中会是多么难找的bug。

<8> 线程池

上面的例子中,我创建了20个线程来完成任务,比如在某些实际应用中,Client端的每个请求Server都需要创建一个线程来处理,

那么当线程很多的时候并不是一件好事情,这会导致过度的使用系统资源而耗尽内存,那么自然就会引入“线程池”。

线程池:是一个在后台执行多个任务的集合,他封装了我们对线程的基本操作,我们能做的就只要把“入口方法”丢给线程池就行了。

特点:  线程池有最大线程数限制,大小在不同的机器上是否区别的,当池中的线程都是繁忙状态,后入的方法就会排队,直至池中有空闲

的线程来处理。

代码: 修改后如下

 1         public static void MainThread() 2         { 3  4             ThreadHelper helper = new ThreadHelper(100); 5  6             for (int i = 0; i < 20; i++) 7             { 8                 ThreadPool.QueueUserWorkItem(new WaitCallback(helper.DoTransactions)); 9             }10 11             //Thread[] thread = new Thread[20];12 13 //for (int i = 0; i < 20; i++)14 //{15 //    thread[i] = new Thread(helper.DoTransactions);16 17 //    thread[i].Name = "线程" + i;18 19 //}20 21 //foreach (var single in thread)22 //{23 //    single.Start();24 //}25         }

转载于:https://www.cnblogs.com/ShaYeBlog/archive/2012/09/11/2680478.html

网络编程——第一篇 基础之进程线程相关推荐

  1. 12篇学通C#网络编程——第一篇 基础之进程线程

    在C#的网络编程中,进程和线程是必备的基础知识,同时也是一个重点,所以我们要好好的掌握一下. 一:概念 首先我们要知道什么是"进程",什么是"线程",好,查一下 ...

  2. 《C#网络编程高级篇之网页游戏辅助程序设计(扫描版)》

    <C#网络编程高级篇之网页游戏辅助程序设计>通过编写C#网络编程语言中具有代表性的实例,向读者深入细致地讲解了如何利用C#语言进行网页游戏辅助程序设计.本书通过大量的代码引导读者一步步学习 ...

  3. 重温《数据库系统概论》【第一篇 基础篇】【第1章 绪论】

    时隔两年,重温数据库,再次学习人大教授王珊.萨师煊的<数据库系统概论>,别有一番滋味在心头,或许这就是软件"不归路"上的感悟吧,又一次打开课本,记忆犹新,在已经学习过大 ...

  4. Windows界面编程第一篇 位图背景与位图画刷

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 本系列主要讲解Wi ...

  5. Webpack系列-第一篇基础杂记

    系列文章 Webpack系列-第一篇基础杂记 Webpack系列-第二篇插件机制杂记 Webpack系列-第三篇流程杂记 前言 公司的前端项目基本都是用Webpack来做工程化的,而Webpack虽然 ...

  6. linux网络编程二:基础socket, bind, listen, accept, connect

    linux网络编程二:基础socket, bind, listen, accept, connect 1. 创建socket #include <sys/types.h>     #inc ...

  7. 重温《数据库系统概论》【第一篇 基础篇】【第5章 数据库完整性】

    本篇内容为中国人民大学教授王珊.萨师煊的<数据库系统概论>自学课程的复习笔记,学习视频源于小破站(传送门),对应视频P32-P36,属教材"[第一篇 基础篇]"的&qu ...

  8. 重温《数据库系统概论》【第一篇 基础篇】【第4章 数据库安全性】

    本篇内容为中国人民大学教授王珊.萨师煊的<数据库系统概论>自学课程的复习笔记,学习视频源于小破站(传送门),对应视频P28-P31,属教材"[第一篇 基础篇]"的&qu ...

  9. 重温《数据库系统概论》【第一篇 基础篇】【第3章 关系数据库标准语言SQL】

    本篇内容为中国人民大学教授王珊.萨师煊的<数据库系统概论>自学课程的复习笔记,学习视频源于小破站(传送门),对应视频P16-P27,属教材"[第一篇 基础篇]"的&qu ...

最新文章

  1. chatbot:基于 AIML 的 PHP 聊天机器人
  2. Postfix邮件设定相关
  3. 副本放置策略Copysets论文解读及工程实践
  4. 云南省计算机专业技术,云南省2018年下半年全国计算机技术与软件专业技术资格(水平)考试顺利举行...
  5. java swing 窗口事件_Javaswing多类窗口怎么写按钮事件呢?
  6. 三星电子首次公布李在镕薪酬 看起来一点儿也不高
  7. windows下替代SSH,Xshell软件的mobaxterm
  8. 点击button后改变文字_24. 教你零基础搭建小程序:小程序的常见组件(5)— button标签...
  9. ISO27001认证的主要步骤
  10. VMware安装deepin
  11. swot分析法案例_项目型销售案例剖析的五大步骤
  12. 苹果手机计算机怎么放桌面,苹果手机桌面图标怎么随意摆放 iPhone桌面图标随意摆放教程 (全文)...
  13. 一篇文章带你搞定 create connection SQLException, url: jdbc:mysql://10.15.16.63:3306/restful, errorCode 1130
  14. Android状态栏添加QS快捷开关
  15. QString的toLocal8bit与toLatin1的区别
  16. These songs can cheer you up when life gets hard
  17. 海康威视SDK告警上传功能整合到springboot(一)
  18. gethostbyname, gethostbyaddr(原来百度叫shifen 十分?)
  19. AMOLED Demura技术分享
  20. 替换MP9486A 替代MP4689 替换LM5007 LM5017 国产芯片内置150V做降压恒压4.2V GPS防盗器专用芯片

热门文章

  1. 【Linux】Makefile文件
  2. 实例手册_独家数据 | 1820Fall 香港研究生商科类14个热门专业 1400+申请实例汇总...
  3. android onclick fragment,Android Fragment onClick按钮方法
  4. 为什么晚上咳嗽很厉害
  5. Oracle中table变量在JDBC中的运用
  6. 使用Laravel框架发送邮件
  7. .net .toString() 金额数据转换
  8. 转:ps aux指令詳解
  9. DELL 14R(n4010)改XP的驱动方法(转)
  10. Android 6种快速开发框架