跟我学VS#语言编程技术——C#中的线程池Thread Pool技术及应用示例
- 格式:pdf
- 大小:230.38 KB
- 文档页数:15
vs使用小技巧VS软件是一款非常实用的文本编辑软件,不仅功能强大,而且简单易用。
以下是一些VS使用的小技巧希望能对大家有所帮助。
1. 快速打开文件:通过按下Ctrl + Alt + O组合键,可以直接打开文件。
这一功能可以在任何时间快速打开需要编辑或查看的文件,极大提高了工作效率。
2. 列编辑模式:按下Alt组合键,然后选择需要编辑的文本块,可以进入列编辑模式。
在这个模式下,对选中的文本块进行编辑操作,可以同时修改多行文本相同或相似的内容。
3. 多光标编辑:按住Ctrl + Alt组合键,然后使用鼠标左键点击文本的多个位置,可以创建多个光标。
这样可以同时在多个光标位置进行编辑,非常方便。
4. 变量重命名:在要重命名的变量上按下F2键,然后输入新的变量名,可以自动修改所有使用该变量的地方。
这样可以快速修改变量名,而不用逐一搜索修改。
5. 代码折叠:在编辑代码时,按下Ctrl + M + O组合键可以折叠所有代码块,按下Ctrl + M + P组合键可以展开所有代码块。
这样可以方便地隐藏和显示代码块,减少阅读时的干扰。
6. 快速切换文件:按下Ctrl + Tab组合键可以在打开的文件之间快速切换。
这个快捷键可以在多个文件之间快速切换,非常方便。
7. 查找和替换:按下Ctrl + F组合键可以打开查找功能,输入要查找的文本,可以快速定位到文本中的位置。
按下Ctrl + H组合键可以打开替换功能,可以将文本中的某一段替换成其他内容。
8. 代码自动补全:输入关键字或函数名的一部分,然后按下Ctrl + 空格组合键,可以弹出代码自动补全的菜单。
这个功能可以帮助我们快速输入命令或代码片段,减少输入错误。
9. 调试功能:VS提供了强大的调试功能,可以逐行执行代码并查看变量的值。
通过设置断点,可以方便地调试程序,并找出错误的原因。
10. 插件扩展:VS支持插件的扩展,可以根据个人需求安装一些有用的插件,来提高工作效率。
vs编程教程VS编程教程是一款非常受欢迎的集成开发环境(IDE),用于开发各种程序,包括桌面应用程序、移动应用程序、Web 应用程序等。
在本篇教程中,我们将介绍VS的基本特点和如何使用它来编写程序。
首先,VS具有友好的用户界面,使得用户能够轻松地浏览和操作各种工具和窗口。
它提供了代码编辑器、调试器、版本控制工具等各种功能,以帮助开发者提高编程效率。
其次,VS支持多种编程语言,包括C#、C++、Java、Python 等。
用户可以根据自己的需要选择适合的语言来开发程序。
而且,VS还提供了丰富的代码模板和示例,可以加快程序的开发速度。
另外,VS还具有强大的调试功能,使得开发者能够方便地查找和修复程序中的错误。
调试器可以在程序执行过程中逐行执行代码,并提供变量的值和调用堆栈等信息,帮助开发者定位错误的位置。
此外,VS还具备广泛的扩展性,用户可以根据自己的需要安装各种插件和扩展。
这些插件包括代码片段生成器、静态代码分析工具、代码编辑辅助工具等,能够帮助开发者更加高效地进行编码。
接下来,我们将详细介绍VS的安装和配置过程。
首先,用户需要从微软官方网站下载并安装VS软件。
安装完成后,用户可以根据自己的需要选择所要安装的组件,如编程语言、调试器、源代码控制等。
安装完成后,用户需要进行一些基本的配置。
比如,设置默认编码格式、代码格式化规范、代码缩进等。
这些配置可以使得编码风格一致,并提高代码的可读性。
然后,我们将介绍如何创建一个新的项目。
用户可以选择所要开发的应用类型,比如控制台应用程序、窗体应用程序、Web 应用程序等。
然后,用户可以选择所要使用的编程语言和框架,并设置一些基本的项目属性。
在项目创建完成后,用户可以开始编写代码了。
VS提供了丰富的代码编辑功能,如代码自动完成、代码高亮、代码折叠等,这些功能可以大大提高编码效率。
最后,我们将介绍如何使用VS进行调试。
用户可以在代码中设置断点,然后通过调试器逐行执行代码。
在我还在上学的时候,我选择了C++,最初我用VC6作为我的IDE,我看过很多本C++的教材,有的适合我,有的不适合我,其中有一本叫《Visual C++ 2005入门经典》的书帮了我不少的忙。
因为通常的C++教材都只会介绍C++的语法什么的,很少会告诉我们如何去编译、运行,告诉我们什么是控制台程序,什么事Win程序,什么是GUI程序,C++能干什么,VC和C++的区别是什么。
现在有很多的朋友应该也有这些问题吧?学C++用C++也有几年了,算不上熟悉,算是初窥门径吧,我想我应该做点什么帮助一下那些和曾经的我一样困惑的朋友,特别是学生朋友,告诉他们他们所困惑的问题的答案。
记得我学C++的时候,没有人教,有的时候也走了不少弯路,甚至连调试也不会,也不知道可以通过看调用堆栈看调用次序,还自己慢慢的去搜索,好傻啊。
接下来我会做一个《Visual C++ 2010入门教程》系列,用来帮助初学者。
刚开始学的时候是很痛苦的,这个我深有体会,特别是身边还没有人能够指导一二的。
内容主要涵盖在Windows下面使用C++进行开发的常见内容,Visual Studio 2010的使用,如何创建新项目,如何调试,如果配置项目属性等等,另外还会介绍Visual C++ 2010中新加如的一些内容,包括一些新的STL组建,一些新的语法支持等等。
由于本人水平有限,其中难免有错误,希望大家谅解,如果大家有发现问题还请务必及时指出来,否则误导了他人我就罪不容恕了。
注意,本教程非C++教程,不会教你C++,只会教你如何使用 Visual C++ 2010去练习去学习其它C++教材上面的程序。
因此建议大家认真的去看其他的C++教程,在使用Visual C++ 2010实践的时候如果遇到问题可以到这里来参考。
推荐《C++ Primer》、《C++程序设计语言》《Visual C++ 2008入门经典》。
第一章关于Visual Studio、VC和C++的那些事首先,这三个东西有什么区别呢?VC和C++是相同的吗,有什么区别呢?我刚开始学C++的时候也有这样的问题,在这里我来替大家解释一下他们到底是什么。
教你使⽤VS Code的MySQL扩展管理数据库的⽅法我将在本⽂告诉你如何⽤VS Code的扩展程序管理MySQL数据库,包括连接到MySQL、新建数据库和表、修改字段定义、简单的查询⽅法以及导⼊导出。
在许多情况下,我们需要随时查看数据库的记录来确保程序是否正确执⾏。
也有许多⼯具提供了可视化的界⾯来帮助我们实现这些功能,例如phpMyAdmin(需要安装PHP和Web服务器)、Navicat(强⼤的SQL管理⼯具,但需要商业授权),也有⼀些免费的⼯具可以使⽤,如Workbench、Sequel Pro、HeidiSQL等等。
当然你也可以直接使⽤mysql控制台去完成所有⼯作。
但如果你正在使⽤VS Code来做主⼒开发,我还是推荐使⽤这上⾯的扩展程序来解决这些简单的需求。
⾸先的好处是免费,在钱包有限的情况下不要做破解⽩嫖党;其次是功能简单,这就意味着我们不需要花精⼒就能掌握它的使⽤。
安装MySQL扩展在VS Code的Extensions(扩展)中可以搜素到许多MySQL的管理⼯具,排名靠前的即可⼏乎都可以满⾜我们的简单需求。
搜索MySQL会出来许多相关⼯具,这⾥我选择了开发作者为cweijan的这个扩展,当然其他的⼯具也可以随你喜欢去选择。
我⼀般关注这个⼯具的安装量、评分和最后更新⼏个指标。
安装完成后在你的VS Code界⾯活动栏便会出现该扩展的按钮。
该扩展有,⼀些使⽤⽅法你可以直接从作者的⽂档中了解,下⾯我记录⼀些在开发中常⽤的MySQL操作。
添加⼀个MySQL连接点击选择活动栏的Database图标;在之后打开DATABASE边栏中点击Add Connection图标,打开connect编辑页;将你的连接信息填到必填项,包括Host连接地址、Port端⼝号、Username⽤户名以及Password密码;其他可选项可根据需求实际填写,例如需要显⽰的数据库名Showed Database(若不填则显⽰所有)等;最后点击Conncet连接即可完成添加。
VS2010/MFC编程入门教程之目录第一部分:VS2010/MFC开发环境VS2010/MFC编程入门之前言VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解)第二部分:VS2010-MFC应用程序框架VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)VS2010/MFC编程入门之四(MFC应用程序框架分析)VS2010/MFC编程入门之五(MFC消息映射机制概述)第三部分:对话框VS2010/MFC编程入门之六(对话框:创建对话框模板和修改对话框属性)VS2010/MFC编程入门之七(对话框:为对话框添加控件)VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)VS2010/MFC编程入门之九(对话框:为控件添加消息处理函数)VS2010/MFC编程入门之十(对话框:设置对话框控件的Tab顺序)VS2010/MFC编程入门之十一(对话框:模态对话框及其弹出过程)VS2010/MFC编程入门之十二(对话框:非模态对话框的创建及显示)VS2010/MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)VS2010/MFC编程入门之十四(对话框:向导对话框的创建及显示)VS2010/MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)VS2010/MFC编程入门之十六(对话框:消息对话框)VS2010/MFC编程入门之十七(对话框:文件对话框)VS2010/MFC编程入门之十八(对话框:字体对话框)VS2010/MFC编程入门之十九(对话框:颜色对话框)第四部分:常用控件VS2010/MFC编程入门之二十(常用控件:静态文本框)VS2010/MFC编程入门之二十一(常用控件:编辑框Edit Control)VS2010/MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box)VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例)VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox)VS2010/MFC编程入门之二十五(常用控件:组合框控件Combo Box)VS2010/MFC编程入门之二十六(常用控件:滚动条控件Scroll Bar)VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control)VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下)VS2010/MFC编程入门之三十二(常用控件:标签控件Tab Control 上)VS2010/MFC编程入门之三十三(常用控件:标签控件Tab Control 下)第五部分:菜单、工具栏与状态栏VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)VS2010/MFC编程入门之三十五(菜单:菜单及CMenu类的使用)VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类)VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用)VS2010/MFC编程入门之三十八(状态栏的使用详解)第六部分:文档、视图和框架VS2010/MFC编程入门之三十九(文档、视图和框架:概述)VS2010/MFC编程入门之四十(文档、视图和框架:各对象之间的关系)VS2010/MFC编程入门之四十一(文档、视图和框架:分割窗口)第七部分:MFC常用类VS2010/MFC编程入门之四十二(MFC常用类:CString类)VS2010/MFC编程入门之四十三(MFC常用类:CTime类和CTimeSpan类)VS2010/MFC编程入门之四十四(MFC常用类:定时器Timer)VS2010/MFC编程入门之四十五(MFC常用类:CFile文件操作类)VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理)第八部分:字体和文本输出VS2010/MFC编程入门之四十七(字体和文本输出:CFont字体类)VS2010/MFC编程入门之四十八(字体和文本输出:文本输出)第九部分:图形图像VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)第十部分:Ribbon界面开发VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)VS2010/MFC编程入门之前言鸡啄米的C++编程入门系列给大家讲了C++的编程入门知识,大家对C++语言在语法和设计思想上应该有了一定的了解了。
1.1跟我学VS#语言编程技术——C#中的线程池Thread Pool技术及应用示例1.1.1C#中的线程池Thread Pool技术及应用示例1、线程池Thread Pool技术概述我们知道,大部分应用程序都是通过线程工作的,该线程等待一些引入的连接,一旦接收到一个连接,就会创建一个新的线程,并且要求这个线程服务于这个新的连接。
在此种工作方式下,当线程比较多的时候,系统的开销将会相当大。
减少系统开销的一个方法就是使用一个线程池来处理,特别是关于在服务应用程序中使用线程的问题。
在服务器端的应用程序中几乎都采用了“线程池”技术,这主要是为了提高系统效率。
因为如果服务器对应每一个请求就创建一个线程的话,在很短的一段时间内就会产生很多创建和销毁线程动作,导致服务器在创建和销毁线程上花费的时间和消耗的系统资源要比花在处理实际的用户请求的时间和资源更多。
线程池就是为了尽量减少这种情况的发生。
2、线程池的工作原理所谓线程池,就是在内存中等待工作的线程,系统会根据工作的情况,自动地创建并管理新的线程。
其工作原理如下图所示:3、ThreadPool类在.NET中,通过System.Threading.ThreadPool类,每个进程都自动带有一个线程池,而且每个进程至多只能有一个线程池,可以在多个不同的行为间共享线程池。
上面我们已经知道了线程池主要用于服务引入的连接,但同时也还可以周期性地进行其它方面的服务,比如检查服务器上的磁盘空间,确保服务器高速运行,检查电子邮件以及服务客户连接等等。
其实,线程池可以使线程变得更容易,很明显还需要处理同步问题,但我们不需要真实地创建线程,.NET会帮助我们做这些。
这里有一个重要的方法逻辑,既然线程池是.NET封装提供的,那线程内部执行的程序,是怎么样按照申请者的要求而变化的呢?这就要使用委托,我们知道,委托就是向一个方法内部传入一段程序,恰恰可以解决这个问题。
4、WaitCallback 委托WaitCallback 表示要在 ThreadPool 线程上执行的回调方法。
创建委托的基本方法是将回调方法传递给 WaitCallback 构造函数。
通过将 WaitCallback 委托传递给 ThreadPool类中的QueueUserWorkItem()方法来将任务排入线程池队列中以便执行。
所传递的回调方法将在某个线程池线程可用时执行。
WaitCallback委托的声明如下:[Serializable] public delegate void WaitCallback( object state);回调方法的声明必须与 WaitCallback 委托声明具有相同的参数;其中的参数state 包含回调方法要使用的信息的对象。
如果要将信息传递给回调方法,请创建包含所需信息的对象,并在将任务排入队列以便执行时将它传递给 QueueUserWorkItem。
每次执行回调方法时,state 参数都包含此对象。
5、QueueUserWorkItem 方法其功能是将回调方法排入线程池队列以便执行。
此方法在有线程池中的线程变得可用时将被自动执行。
WaitCallback s1=new WaitCallback(threadBody);ThreadPool.QueueUserWorkItem(s1);6、应用例一下面做个比较简单的联系,模拟一个服务器工作的应用程序。
(1)构造C#程序的GUI界面(2)编程按钮的事件响应(3)执行该程序注意:完成500个请求,其实只需要38个线程。
大大地减少了线程的个数。
(4)代码如下:using System;using System.Drawing;using System.Collections;using ponentModel;using System.Windows.Forms;using System.Data;using System.Threading;namespace NetThreadPool{///<summary>/// Form1 的摘要说明。
///</summary>public class Form1 : System.Windows.Forms.Form{private System.Windows.Forms.Button button1;private System.Windows.Forms.ListBox listBox1;private System.Windows.Forms.Button button2;private System.Windows.Forms.TextBox textBox1;///<summary>///必需的设计器变量。
///</summary>private ponentModel.Container components = null;public Form1(){//// Windows 窗体设计器支持所必需的//InitializeComponent();}///<summary>///清理所有正在使用的资源。
///</summary>protected override void Dispose( bool disposing ){if( disposing ){if (components != null) {components.Dispose();}}base.Dispose( disposing );}#region Windows 窗体设计器生成的代码///<summary>///设计器支持所需的方法- 不要使用代码编辑器修改///此方法的内容。
///</summary>private void InitializeComponent() {this.button1 = new System.Windows.Forms.Button();this.listBox1 = new System.Windows.Forms.ListBox();this.button2 = new System.Windows.Forms.Button();this.textBox1 = new System.Windows.Forms.TextBox();this.SuspendLayout();//// button1//this.button1.Location = new System.Drawing.Point(16, 16); = "button1";this.button1.Size = new System.Drawing.Size(88, 24);this.button1.TabIndex = 0;this.button1.Text = "启动线程";this.button1.Click += new System.EventHandler(this.button1_Click);//// listBox1//this.listBox1.ItemHeight = 12;this.listBox1.Location = new System.Drawing.Point(8, 64); = "listBox1";this.listBox1.Size = new System.Drawing.Size(344, 184);this.listBox1.TabIndex = 1;//// button2//this.button2.Location = new System.Drawing.Point(136, 16); = "button2";this.button2.Size = new System.Drawing.Size(72, 24);this.button2.TabIndex = 2;this.button2.Text = "结束线程";this.button2.Click += new System.EventHandler(this.button2_Click); //// textBox1//this.textBox1.Location = new System.Drawing.Point(240, 16); = "textBox1";this.textBox1.Size = new System.Drawing.Size(88, 21);this.textBox1.TabIndex = 3;this.textBox1.Text = "500";//// Form1//this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);this.ClientSize = new System.Drawing.Size(360, 273);this.Controls.Add(this.textBox1);this.Controls.Add(this.button2);this.Controls.Add(this.listBox1);this.Controls.Add(this.button1); = "Form1";this.Text = "Form1";this.ResumeLayout(false);}#endregion///<summary>///应用程序的主入口点。
///</summary>[STAThread]static void Main() {Application.Run(new Form1());}private void button1_Click(object sender, System.EventArgs e){ //启动线程int threadNumber;for (threadNumber = 1;threadNumber<=500;threadNumber++){TaskContent task=new TaskContent();task.LB = listBox1;task.Ms = int.Parse(textBox1.Text);task.ID = threadNumber;task.GoWork();}listBox1.Items.Add("已完成" + threadNumber.ToString() + "次循环");}private void button2_Click(object sender, System.EventArgs e){ //结束线程listBox1.Items.Clear();}}}class TaskContent{public ListBox LB;public int ID;//线程的工作时间public int Ms;//告诉对象开始工作...public void GoWork(){//注意,C#和VB在这里写法不同,它必须强制实现委托的实例WaitCallback s1=new WaitCallback(threadBody);ThreadPool.QueueUserWorkItem(s1);}//开始线程池的工作...public void threadBody(object s){LB.Items.Add(ID.ToString() + ":" + Thread.CurrentThread.GetHashCode().ToString() + "开始");//休眠Ms毫秒,模拟一个线程的工作Thread.Sleep(Ms);LB.Items.Add(ID.ToString() + ":" + Thread.CurrentThread.GetHashCode().ToString() + "结束");}}说明:TaskContent就是一个普通的类,用来完成一些需要的行为,由于这个例子只是研究一个工作框架,所以我们不需要这个类做什么事情,只是要它静止的闲置一段时间。