郑州正规的网站制作价钱,网易企业邮箱是什么意思,项目建设综述,网站建设合同约定三年后在C#的网络编程中#xff0c;进程和线程是必备的基础知识#xff0c;同时也是一个重点#xff0c;所以我们要好好的掌握一下。 一#xff1a;概念 首先我们要知道什么是”进程”#xff0c;什么是“线程”#xff0c;好#xff0c;查一下baike。 进程#xff1a;是一个… 在C#的网络编程中进程和线程是必备的基础知识同时也是一个重点所以我们要好好的掌握一下。 一概念 首先我们要知道什么是”进程”什么是“线程”好查一下baike。 进程是一个具有一定独立功能的程序关于某个数据集合的一次活动。它是操作系统动态执行的基本单元 在传统的操作系统中进程既是基本的分配单元也是基本的执行单元。 线程是进程中某个单一顺序的控制流。 关于这两个概念大家稍微有个印象就行了防止以后被面试官问到。 二进程 framework里面对“进程”的基本操作的封装还是蛮好的能够满足我们实际开发中的基本应用。 1 获取进程信息 framework中给我们获取进程的方式还是蛮多的即可以按照Name获取也可以按照ID获取也可以获取本地和远程的进程信息。 public Process[] GetProcess(string ip ){if (string.IsNullOrEmpty(ip))return Process.GetProcesses();return Process.GetProcesses(ip);} Process process Process.GetProcessById(Convert.ToInt32(processID)); 2 启动和停止进程 其实这个也没啥好说的不过有一个注意点就是Process中的kill和CloseMainWindow的区别。 windowMainWindow: 当我们打开的Process是一个有界面的应用程序时推荐使用此方法它相当于点击了应用程序的关闭按钮是一个有序的 终止应用程序的操作而不像kill那么暴力。 kill 根据这个单词估计大家都知道啥意思吧它的作用就是强制关闭我们打开的Process往往会造成就是我们数据的丢失所以 说在万不得已的情况下不要使用kill当然在无图形界面的应用程序中kill是唯一能够结束Process的一个策略。 3 进程操作的一个演示 public class ProgessHelper{//主操作流程public static void MainProcess(){ProgessHelper helper new ProgessHelper();var result helper.GetProcess();helper.ShowProcess(result.Take(10).ToArray());Console.Write(\n请输入您要查看的进程);helper.ShowProcessSingle(Console.ReadLine());Console.Write(\n请输入您要开启的程序\t);var name helper.StartProcess(Console.ReadLine());Console.WriteLine(程序已经开启是否关闭(0,1));if (Console.ReadLine() 1){helper.StopProcess(name);Console.WriteLine(关闭成功。);}}#region 获取进程/// summary
/// 获取进程
/// /summary
/// param nameip/param
/// returns/returnspublic Process[] GetProcess(string ip ){if (string.IsNullOrEmpty(ip))return Process.GetProcesses();return Process.GetProcesses(ip);}#endregion#region 查看进程/// summary
/// 查看进程
/// /summary
/// param nameprocess/parampublic void ShowProcess(Process[] process){Console.WriteLine(进程ID\t进程名称\t物理内存\t\t启动时间\t文件名);foreach (var p in process){try{Console.WriteLine({0}\t{1}\t{2}M\t\t{3}\t{4}, p.Id, p.ProcessName.Trim(), p.WorkingSet64 / 1024.0f / 1024.0f,p.StartTime, p.MainModule.FileName);}catch (Exception ex){Console.WriteLine(ex.Message);}}}#endregion#region 根据ID查看指定的进程/// summary
/// 根据ID查看指定的进程
/// /summary
/// param nameprocessID/parampublic void ShowProcessSingle(string processID){Process process Process.GetProcessById(Convert.ToInt32(processID));Console.WriteLine(\n\n您要查看的进程详细信息如下\n);try{var module process.MainModule;Console.WriteLine(文件名:{0}\n版本{1}\n描叙{2}\n语言:{3}, module.FileName, module.FileVersionInfo.FileVersion,module.FileVersionInfo.FileDescription,module.FileVersionInfo.Language);}catch (Exception e){Console.WriteLine(e.Message);}}#endregion#region 进程开启/// summary
/// 进程开启
/// /summary
/// param namefileName/param
/// returns/returnspublic string StartProcess(string fileName){Process process new Process();process.StartInfo new ProcessStartInfo(fileName);process.Start();return process.ProcessName;}#endregion#region 终止进程/// summary
/// 终止进程
/// /summary
/// param namename/parampublic void StopProcess(string name){var process Process.GetProcessesByName(name).FirstOrDefault();try{process.CloseMainWindow();}catch (Exception ex){Console.WriteLine(ex.Message);}}#endregion} 快看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 这位老前辈已经给我们提供了很多的实现同步线程的类比如MutexMonitor Interlocked和AutoResetEvent当然在实际应用中我们还是喜欢使用简化版的lock因为这玩意能够使编程简化同时使 程序看起来简洁明了。 6 同样我也举个例子 public class ThreadHelper{public static void MainThread(){ThreadHelper helper new ThreadHelper(100);Thread[] thread new Thread[20];for (int i 0; i 20; i){thread[i] new Thread(helper.DoTransactions);thread[i].Name 线程 i;}foreach (var single in thread){single.Start();}}int balance;object obj new object();public ThreadHelper(int balance){this.balance balance;}#region 取款操作/// summary
/// 取款操作
/// /summary
/// param nameamount/parampublic void WithDraw(int amount){lock (obj){if (balance 0){Console.WriteLine(哈哈已经取完了);return;}if (balance amount){Console.WriteLine(取款前余额:{0},取款{1},还剩余额:{2}, balance, amount, balance - amount);balance balance - amount;}else{Console.WriteLine(取款前余额:{0},取款{1},还剩余额:{2}, balance, balance, balance 0);}}}#endregion#region 自动取款操作/// summary
/// 自动取款操作
/// /summarypublic void DoTransactions(object obj){int random new Random().Next(4, 10);Thread.Sleep(5000);WithDraw(random);}#endregion} 当我们加上lock的时候一切正常但是当我们把lock去掉的时候看看线程们会有“争用资源”的现象吗在下图中可以看到出现了如下的现象 当然这不是我想看到的结果如果在实际应用中会是多么难找的bug。 8 线程池 上面的例子中我创建了20个线程来完成任务比如在某些实际应用中Client端的每个请求Server都需要创建一个线程来处理 那么当线程很多的时候并不是一件好事情这会导致过度的使用系统资源而耗尽内存那么自然就会引入“线程池”。 线程池是一个在后台执行多个任务的集合他封装了我们对线程的基本操作我们能做的就只要把“入口方法”丢给线程池就行了。 特点 线程池有最大线程数限制大小在不同的机器上是否区别的当池中的线程都是繁忙状态后入的方法就会排队直至池中有空闲 的线程来处理。 代码 修改后如下 public static void MainThread(){ThreadHelper helper new ThreadHelper(100);for (int i 0; i 20; i){ThreadPool.QueueUserWorkItem(new WaitCallback(helper.DoTransactions));}//Thread[] thread new Thread[20];//for (int i 0; i 20; i)
//{
// thread[i] new Thread(helper.DoTransactions);// thread[i].Name 线程 i;//}//foreach (var single in thread)
//{
// single.Start();
//}}