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

       在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 name="ip"></param>
/// <returns></returns>public Process[] GetProcess(string ip = ""){if (string.IsNullOrEmpty(ip))return Process.GetProcesses();return Process.GetProcesses(ip);}#endregion#region 查看进程/// <summary>
/// 查看进程
/// </summary>
/// <param name="process"></param>public 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 name="processID"></param>public 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 name="fileName"></param>
/// <returns></returns>public string StartProcess(string fileName){Process process = new Process();process.StartInfo = new ProcessStartInfo(fileName);process.Start();return process.ProcessName;}#endregion#region 终止进程/// <summary>
/// 终止进程
/// </summary>
/// <param name="name"></param>public 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 这位老前辈已经给我们提供了很多的实现同步线程的类,比如Mutex,Monitor,

          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 name="amount"></param>public 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>
/// 自动取款操作
/// </summary>public 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();
//}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建立学生选课表 mysql 语句_MySQL常用SQL语句(Python实现学生、课程、选课表增删改查)...

以基本的学生选课为例&#xff0c;建立选课数据库&#xff0c;学生、班级、选课信息三张表&#xff0c;并分别对表进行插删改操作&#xff1a;import MySQLdbtry:conn MySQLdb.connect(host localhost, user root, passwd root, db xuanke, port 3306)cur conn.cursor()…

加快网站访问速度--jquery.js

jquery现在是越来越大&#xff0c;网络加载速度上我们应该做到能省就省&#xff0c;毫无疑问google的服务器和cdn以及访问速度是非常快的&#xff0c;而且google敞开怀抱&#xff0c;提供各种代码库给我们下载调用。jquery就是其中一个。 在jquery官网有从google 微软microsoft…

也谈程序员的35岁危机

前言本来这期要推一篇观察者模式和发布订阅模式的技术文给各位看官(在写了)&#xff0c;但无奈最近爱奇艺裁员事件引起了轩然大波&#xff0c;互联网上和各种技术群又展开了轰轰烈烈的讨论&#xff0c;每位IT从业者都不能独善其身。那么今天这一期我们就聊聊程序员的35岁危机究…

豆瓣评分9.4!这部大片你不应该错过,每一秒都是不敢看的残忍!

全世界只有3.14 % 的人关注了爆炸吧知识人类占据了地球上绝大多数宜居的地方&#xff0c;我们面对着温柔的地球母亲&#xff0c;但对野生动物们来说&#xff0c;地球却是一个水深火热的星球。你觉得你已经一无所有了&#xff0c;你觉得生活的负荷已经让你难以前进了&#xff1b…

Unity3D4.* NGUI制作动态字库

新建一个工程&#xff0c;这个工程必须没有中文路径&#xff0c;否则会不识别字体&#xff01;&#xff01;&#xff01; 首先导入NGUI插件&#xff0c;这里我用的是NGUI 3.0.2版本的。 在Assets 下创建一个文件夹&#xff0c;用来存放接下来的工作文件 。 这里随便选择一种字体…

java解析json_JAVA解析JSON数据

在使用第三方api的使用&#xff0c;有时候会从网络中获得json数据&#xff0c;所以说我们将如何解析json数据&#xff1f;下面小编将通过以下几点来进行json的讲解JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read…

Android之android studio如何解决‘:app:packageDebug‘.(Duplicate files copied in APK META-INF/DEPENDENCIES)

不废话&#xff0c;先爆照 今天在使用glide的时候&#xff0c;我在项目里面添加了httpcore-4.3.2.jar和4.3.5.jar包&#xff0c;但是当我运行的时候就出现了这个错误 然后在build.gradle里面配置下面的信息就好了&#xff0c; android { packagingOptions { exclude META-IN…

Asp.Net MVC4.0 官方教程 入门指南之一-- 入门介绍

本教程将为您讲解使用微软的Visual Studio 2012 来建立一个ASP.NET MVC4 Web应用程序所需要的基础知识。 本示例将构建什么样的应用程序&#xff1f; 您将实现一个简单的电影管理应用程序&#xff0c;此程序将从数据库中选取记录展示列表&#xff0c;支持查询和查看&#xff0…

关注!这所211高校通知不放寒假!校园将实行封闭管理!

全世界只有3.14 % 的人关注了爆炸吧知识本文转自&#xff1a;募格学术新年伊始&#xff0c;北京顺义&#xff0c;辽宁大连、沈阳&#xff0c;黑龙江黑河&#xff0c;河北石家庄、邢台等地相继报告新增本土病例&#xff0c;随着春节的临近&#xff0c;人员流动和聚集增加&#x…

MediatR 在.NET应用中的实践

MediatR 简介MediatR是.NET中的开源简单中介者模式实现.它通过一种进程内消息传递机制&#xff08;无其他外部依赖&#xff09;&#xff0c;进行请求/响应、命令、查询、通知和事件的消息传递&#xff0c;并通过泛型来支持消息的智能调度。开源库地址是https://github.com/jbog…

java 录屏_java 录屏 小工具源码(idea)

【实例简介】录制的视频保存在 java.io.tmpdir 目录&#xff0c;windows通常为 C:\Users\Administrator\AppData\Local\Temp【实例截图】点击播放后&#xff0c;效果如下&#xff1a;【核心代码】import java.awt.AWTException;import java.awt.Color;import java.awt.Dimensio…

Java - 强引用、弱引用、软引用、虚引用

1、强引用&#xff08;StrongReference&#xff09; 强引用是使用最普遍的引用。如果一个对象具有强引用&#xff0c;那垃圾回收器绝不会回收它。如下&#xff1a; Object onew Object(); // 强引用 当内存空间不足&#xff0c;Java虚拟机宁愿抛出OutOfMemoryError错误&am…

dede织梦5.7,后台采集数据导入,空文章过滤.

为什么80%的码农都做不了架构师&#xff1f;>>> 后台目录下 dede/co_export.php 186行左右 else if($itemName litpic){$litpic trim($ctag->GetInnerText());} } 下面添加&#xff0c;变成 else if($itemName litpic){$litpic trim($ctag->GetInnerT…

真正的男人要勇于承担责任......

1 下个月可以住贵一点的房子了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 当灯牌坏了一个&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 当前男友提着钱上门▼4 真正的男人要勇于承担责任&#xff08;via.豆瓣 pink&#xff09;▼5 &#xff1f…

WPF里面的常用笔刷

程序运行效果 <Window x:Class"This_brush.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"Title"MainWindow" Height"350" Width…

没想到,错误的单例写法,让 RabbitMQ 大量超时导致程序挂死!

一&#xff1a;背景 1. 讲故事10月份星球里的一位老朋友找到我&#xff0c;说他们公司的程序在一个网红直播带货下给弄得无响应了&#xff0c;无响应期间有大量的 RabbitMQ 超时&#xff0c;寻求如何找到根源&#xff0c;聊天截图我就不发了。既然无响应了&#xff0c;那必然是…

Android之OKHttp使用总结

介绍: OkHttp是一个高效的HTTP库: 持 SPDY ,共享同一个Socket来处理同一个服务器的所有请求如果SPDY不可用,则通过连接池来减少请求延时无缝的支持GZIP来减少数据流量缓存响应数据来减少重复的网络请求 会从很多常用的连接问题中自动恢复。如果您的服务器配置了多个IP地址…

开车走吗?朋友......

1 冬天出门有多难&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 这张图你们明白了什么&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 奥特曼不用吃饭&#xff08;via.杰克波比&#xff0c;侵删&#xff09;▼4 为什么没人敢动孟婆&…

WPF中使用资源

这节讲一下如何在WPF中使用资源。01了解资源在编程中&#xff0c;一个变量&#xff0c;一段代码&#xff0c;一张图片&#xff0c;一段视频或者音频&#xff0c;这种可以拿来为我所用的东西就可以称之为资源&#xff0c;一个让人眼前一亮的程序&#xff0c;可能会使用到许许多多…

清华放大招!竟然连初三学生都招,一条龙培养到博士,还不准转专业......

全世界只有3.14 % 的人关注了爆炸吧知识提前5年博士毕业近日&#xff0c;清华大学本科招生网发布了一则重要公告——《清华大学2021年丘成桐数学科学领军人才培养计划招生办法》。在这则公告中&#xff0c;初三生&#xff0c;你没看错&#xff0c;是没有参加过中考、高考的初三…