网络编程教学思路.doc_第1页
网络编程教学思路.doc_第2页
网络编程教学思路.doc_第3页
网络编程教学思路.doc_第4页
网络编程教学思路.doc_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

网络编程参考教材l C# 3.0完全自学宝典.强锋科技.清华大学出版社.2008.7l C#网络应用编程(第2版).马骏主编.人民邮电出版社.2010教学环境l 操作系统:windows Server 2003 R2l 开发环境:Visual Studio 2008 Team Suitel 数据库环境:Microsoft SQL Server 2008教学目标l 完整的IM应用程序界面及功能实现(*)l 私聊与群聊的实现l 文件传递的实现(在线与离线方式)l 内置浏览器、邮箱监控与FTP的实现l 视频聊天的实现l 网络通信中的数据加密更新时间文档创建时间:2011-9-4 16:10最后修改时间:2011-11-7 21:07修改次数:7次适用范围计算机科学与技术专业2009级本科生计算机科学与技术学院2011-2012学年第一学期第一部分 WinForm设计1.1 .NET Framework 与Visual Studio 2008 .NET是一种全新的技术,其平台由公共语言运行时、基础类库和公共语言规范组成。基础类库展现了公共语言运行时的功能,类似于Windows API。但基础类库提供了比API更为高层的功能来方便代码的重用。作为一个新的平台,它包括了很多新特性:一致的编程模式,简化的编程模式,平台与处理器独立,支持多语言的开发,自动内存管理,一致的出错处理方式,完美的安全机制,XML和SOAP的引入等。C#是从C和C+演变而来的,并且结合了C/C+的强大功能、Java的面向对象特性和Visual Basic的易用性,从而成为一种简单的类型安全、面向对象的编程语言,也是.NET公共语言运行环境的内置语言。C#代码可以从公共语言运行库的服务中获益。C#同时还具有Delphi的一些优点。 为了减轻在命令行构建软件的负担,提高开发效率,大多数开发人员都使用后一种方法进行开发。Visual Studio 2008正是微软公司推出的,现阶段用于创建C#.NET应用程序的最简单、快捷的开发工具,使用它可以开发控制台应用程序、Windows应用程序和Web应用程序。*关于Visual Studio的版本:l Visual Studio 2005(对应.NET Framework 2.0)l Visual Studio 2008(对应.NET Framework 3.5)*课堂使用的版本l Visual Studio 2010(对应.NET Framework 4.0)要创建一个Windows应用程序,启动Visual Studio 2008,在“文件”菜单中选择“新建项目”,对话框中选择“Visual C#”“Windows”Windows窗体应用程序,选择对应的.Framework版本号(默认为3.5),输入项目名称,就可以创建一个Windows应用程序了。默认情况下,在“解决方案资源管理器”中,包括两个部分:Form窗体和启动程序Programe.CSProgram.CS是带有Main入口函数的类,其主要代码如下:static void Main() Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1(); 注意:Form1也是一个类,必须实例化后才能使用。1.2 Windows窗体与各类常见控件预备知识:* 命名空间* 对象及其属性和事件 * 变量命名法问题1.2.1 windows窗体与皮肤控件Windows窗体是一个容器,自身有自己的属性和各种事件。同是它可以容纳多个控件。一 窗体的重要属性(1)Name属性:默认的窗体Name是Form1、Form2等,这些窗体名称无实际意义,建议将其修改成Login.cs、Main.cs等名称。(2)Text属性:显示在Form标题栏的名称,可以使用中文。(3)Minimize和Maximize属性:最大化和最小化按钮,两者都设置为False时,只有关闭按钮出现。(4)Opacity属性:窗体的透明度,默认不透明。(5)Visible属性:窗体的可见属性。(6)ShowInTaskbar:程序是否显示在任务栏,默认显示。(7)TopMost属性:本窗体是否在其它窗体前端。二窗体常见事件:(1)Form_load( )事件:用来在程序初始化时就需要执行的代码,如与远程服务器实现连接。可以通过双击窗体空白处进入代码或者在属性页找到“事件”进行处理。(2)Form1_FormClosing()事件:窗体关闭事件,在关闭窗体时触发,如QQ在关闭时,会询问关闭还是最小化到系统通知区域。后者通常配合一个托盘图标(NotifyIcon)使用。 如果错误操作产生了一个事件的代码框架,在不使用的情况不要随意删除,否则会无法编译通过,正确的操作是删除代码框架后,还需要在事件列表删除对应事件名称。实验:设计一个窗体,点击关闭后,最小化到系统通知区域,任务栏中显示,单击托盘图标可以还原窗体。操作:建立项目,从工具箱中拖入一个NotifyIcon,放到主界面中,进行相关属性设置。private void Form1_FormClosing(object sender, FormClosingEventArgs e) e.Cancel = true; this.Visible = false; 此时,窗体将无法进行任何操作,需要给托盘图标写入相关代码。private void notifyIcon1_MouseClick(object sender, MouseEventArgs e) if (e.Button = System.Windows.Forms.MouseButtons.Left) this.Visible = true; notifyIcon1.Visible = false; 三第三方控件:窗体皮肤的加载1. 将IrisSkin2.dll文件连同skin文件夹拷贝到项目文件中。把IrisSkin2.dll文件添加到当前项目引用(解决方案资源管理器-当前项目-引用-右键-添加引用 ,找到IrisSkin2.dll文件.IrisSkin2.dll文件最好放在当前项目binDebug文件中.2. 然后把IrisSkin2.dll文件添加到vc2005的工具箱:右键-选择项-浏览找到IrisSkin2.dll文件(文件最好放在当前项目binDebug文件中)按确定,控件就添加到工具箱中了.然后把工具箱中新添加的 SkinEngine控件拖到当前项目中。3. 把皮肤目录中的.ssk文件复制到当前项目binDebug文件中,4. 再在项目中调用.ssk皮肤文件。选择控件skinEngine1的skinFile 属性,浏览找到对应的ssk文件。四窗体间的调用在Program.CS文件中,我们看到调用默认窗体是采用了New Form1(),由于窗体与其它控件都是系统中的类,在调用时必须采用类的实例化方法,如在“登录”中调用main窗体:private void button1_Click(object sender, EventArgs e) main mainForm = new main(); this.Hide(); mainForm.Show(); 此处,当显示main窗体后,登录窗体被隐藏,程序无法正常中止,需要在main的FormClosing事件中,加入Application.Exit(),才可以退出应用程序。调试过程中,也可以直接选择菜单“调试”中的“停止调试”。本例中调用main时没有向其传入相关参数,以后改进。1.2.2 最常用控件Label、Button和TextBox :按钮控件,:标签控件,:文本框控件:1.2.3 容器类控件GroupBox、Panel、TabControl:选项卡控件,用于将一组相似功能放在不同的选项卡中。 本类控件一般用于将面板上多种功能的控件进行归类,本身并没有什么大的功能。1.2.4 列表类控件ComboBox、ListBox、RadioButton、CheckBox :1.2.5 其它控件:1.3 菜单、工具栏、状态栏与快捷菜单1.3.1 标准菜单MenuStrip从工具箱的“菜单与工具栏”中拖放一个MenuStrip控件放在主界面,会以所见即所得的方式对菜单进行编辑。如这样的效果,只需要输入“文件(&F)”,快捷键在菜单项的属性中找到ShortCutKeys,设置相应的键。分隔线直接在相应位置输入连字符“-”即可。要为相应的菜单项建立代码,双击对应菜单项,输入代码。 在Windows操作系统,一种功能通过菜单、工具栏、快捷键操作等多种方式实现,如果为每个事件都编写代码显然是不现实的。所以在windows系统中,我们约定俗成地规定:菜单项中包括系统所有的功能;工具栏中包括当前系统常见的功能;而快捷菜单则包括当前对象常用的功能;因此,事件代码应该写在菜单项中,其它地方只需要调用即可。实验:建立工具栏从工具箱中拖入ToolStrip,放置到主界面中,选择图标类型Button,替换其图像,双击进行编码,注意:工具栏不进行代码的编写,直接调用菜单的功能。退出ToolStripMenuItem_Click(sender,e)实验:编写“退出”菜单项代码建立相应菜单项,双击“退出”进入代码编写页面:private void 退出ToolStripMenuItem_Click(object sender, EventArgs e) this.Close(); this.Dispose(); Application.Exit(); 1.3.2 工具栏ToolStrip1.3.3 状态栏StatusStrip状态栏主要用来显示系统运行时的状态,及各种提示信息。使用状态栏直接从工具箱拖入StatusStrip控件,1.3.4 快捷菜单ContextMenuStrip实验:设计快捷菜单并完成功能;从工具箱中拖入ContextMenuStrip,设计一个功能“退出”,代码:退出ToolStripMenuItem_Click(sender, e);上下文菜单与某个对象关联,否则该菜单无法显示;我们将其与NotifyIcon控件的ContextMenuStrip属性绑定,当程序最小化后,在托盘图标单击右键可以看到该菜单,并且有具体的功能实现。1.4 各类对话框控件(补充调用形式及返回值:实际代码演示)1.3.1 颜色选取对话框ColorDialog1.3.2 字体选择对话框FontDialog1.3.3 打开文件对话框OpenDialog1.3.4 保存文件对话框SaveAsDialog1.3.5 浏览文件夹对话框FolderBrowserDialog1.3.6 将窗口作为对话框打开OpenAsDialog()1.5 文件操作1.5.1 IO访问命名空间using System.IO;using System.Text;其中包含了8个类:File;FileInfo;Directory; DirectoryInfo; BinaryReader; BinaryWriter; StreamReader;StreamWriter;首先要熟悉.NET中处理文件和文件夹的操作。File类和Directory类是其中最主要的两个类。了解它们将对后面功能的实现提供很大的便利。 System.IO.File类和System.IO.FileInfo类主要提供有关文件的各种操作,在使用时需要引用System.IO命名空间。下面通过程序实例来介绍其主要属性和方法。 (1) 文件打开方法:File.Open ()该方法的声明如下:public static FileStream Open(string path,FileMode mode) 下面的代码打开存放在c:tempuploads目录下名称为newFile.txt文件,并在该文件中写入hello。 private void OpenFile() FileStream.TextFile=File.Open(c:tempuploadsnewFile.txt,FileMode.Append);byte Info = (byte)h,(byte)e,(byte)l,(byte)l,(byte)o;TextFile.Write(Info,0,Info.Length);TextFile.Close(); (2) 文件创建方法:File.Create() 该方法的声明如下: public static FileStream Create(string path;)下面的代码演示如何在c:tempuploads下创建名为newFile.txt的文件。 由于File.Create方法默认向所有用户授予对新文件的完全读/写访问权限,所以文件是用读/写访问权限打开的,必须关闭后才能由其他应用程序打开。为此,所以需要使用FileStream类的Close方法将所创建的文件关闭。 private void MakeFile() FileStream NewText=File.Create(c:tempuploadsnewFile.txt); NewText.Close(); (3) 文件删除方法:File.Delete() 该方法声明如下: public static void Delete(string path);下面的代码演示如何删除c:tempuploads目录下的newFile.txt文件。 private void DeleteFile()File.Delete(c:tempuploadsnewFile.txt);(4) 文件复制方法:File.Copy 该方法声明如下: public static void Copy(string sourceFileName,string destFileName,bool overwrite); 下面的代码将c:tempuploadsnewFile.txt复制到c:tempuploadsBackUp.txt。由于Cope方法的OverWrite参数设为true,所以如果BackUp.txt文件已存在的话,将会被复制过去的文件所覆盖。 private void CopyFile()File.Copy(c:tempuploadsnewFile.txt,c:tempuploadsBackUp.txt,true); (5) 文件移动方法:File.Move 该方法声明如下: public static void Move(string sourceFileName,string destFileName); 下面的代码可以将c:tempuploads下的BackUp.txt文件移动到c盘根目录下。注意: 只能在同一个逻辑盘下进行文件转移。如果试图将c盘下的文件转移到d盘,将发生错误。 private void MoveFile()File.Move(c:tempuploadsBackUp.txt,c:BackUp.txt);(6) 设置文件属性方法:File.SetAttributes该方法声明如下: public static void SetAttributes(string path,FileAttributes fileAttributes);下面的代码可以设置文件c:tempuploadsnewFile.txt的属性为只读、隐藏。 private void SetFile()File.SetAttributes(c:tempuploadsnewFile.txt,FileAttributes.ReadOnly|FileAttributes.Hidden);文件除了常用的只读和隐藏属性外,还有Archive(文件存档状态),System(系统文件),Temporary(临时文件)等。关于文件属性的详细情况请参看MSDN中FileAttributes的描述。 (7) 判断文件是否存在的方法:File.Exists 该方法声明如下: public static bool Exists(string path); 下面的代码判断是否存在c:tempuploadsnewFile.txt文件。若存在,先复制该文件,然后其删除,最后将复制的文件移动;若不存在,则先创建该文件,然后打开该文件并进行写入操作,最后将文件属性设为只读、隐藏。 if(File.Exists(c:tempuploadsnewFile.txt) /判断文件是否存在CopyFile(); /复制文件DeleteFile(); /删除文件MoveFile(); /移动文件elseMakeFile(); /生成文件OpenFile(); /打开文件SetFile(); /设置文件属性 此外,File类对于Text文本提供了更多的支持。 AppendText:将文本追加到现有文件 CreateText:为写入文本创建或打开新文件 OpenText:打开现有文本文件以进行读取 但上述方法主要对UTF-8的编码文本进行操作,从而显得不够灵活。在这里推荐读者使用下面的代码对txt文件进行操作。 对txt文件进行“读”操作,示例代码如下: StreamReader TxtReader = new StreamReader(c:tempuploadsnewFile.txt,System.Text.Encoding.Default);string FileContent;FileContent = TxtReader.ReadEnd();TxtReader.Close(); 对txt文件进行“写”操作,示例代码如下: StreamWriter = new StreamWrite(c:tempuploadsnewFile.txt,System.Text.Encoding.Default);string FileContent;TxtWriter.Write(FileContent);TxtWriter.Close(); System.IO.Directory类和System.DirectoryInfo类 主要提供关于目录的各种操作,使用时需要引用System.IO命名空间。下面通过程序实例来介绍其主要属性和方法。 (1) 目录创建方法:Directory.CreateDirectory 该方法声明如下: public static DirectoryInfo CreateDirectory(string path);下面的代码演示在c:tempuploads文件夹下创建名为NewDirectory的目录。 private void MakeDirectory()Directory.CreateDirectory(c:tempuploadsNewDirectoty); (2) 目录属性设置方法:DirectoryInfo.Atttributes 下面的代码设置c:tempuploadsNewDirectory目录为只读、隐藏。与文件属性相同,目录属性也是使用FileAttributes来进行设置的。 private void SetDirectory()DirectoryInfo NewDirInfo = new DirectoryInfo(c:tempuploadsNewDirectoty);NewDirInfo.Atttributes = FileAttributes.ReadOnly|FileAttributes.Hidden; (3) 目录删除方法:Directory.Delete 该方法声明如下: public static void Delete(string path,bool recursive);下面的代码可以将c:tempuploadsBackUp目录删除。Delete方法的第二个参数为bool类型,它可以决定是否删除非空目录。如果该参数值为true,将删除整个目录,即使该目录下有文件或子目录;若为false,则仅当目录为空时才可删除。 private void DeleteDirectory()Directory.Delete(c:tempuploadsBackUp,true);(4) 目录移动方法:Directory.Move 该方法声明如下: public static void Move(string sourceDirName,string destDirName);下面的代码将目录c:tempuploadsNewDirectory移动到c:tempuploadsBackUp。 private void MoveDirectory()File.Move(c:tempuploadsNewDirectory,c:tempuploadsBackUp); (5) 获取当前目录下的所有子目录方法:Directory.GetDirectories 该方法声明如下: public static string GetDirectories(string path;); 下面的代码读出c:tempuploads目录下的所有子目录,并将其存储到字符串数组中。 private void GetDirectory()string Directorys;Directorys = Directory. GetDirectories (c:tempuploads);(6) 获取当前目录下的所有文件方法:Directory.GetFiles 该方法声明如下: public static string GetFiles(string path;); 下面的代码读出c:tempuploads目录下的所有文件,并将其存储到字符串数组中。 private void GetFile()string Files;Files = Directory. GetFiles (c:tempuploads,);(7) 判断目录是否存在方法:Directory.Exist 该方法声明如下: public static bool Exists(string path;);下面的代码判断是否存在c:tempuploadsNewDirectory目录。若存在,先获取该目录下的子目录和文件,然后其移动,最后将移动后的目录删除。若不存在,则先创建该目录,然后将目录属性设为只读、隐藏if(File.Exists(c:tempuploadsNewDirectory) /判断目录是否存在GetDirectory(); /获取子目录GetFile(); /获取文件MoveDirectory(); /移动目录DeleteDirectory(); /删除目录elseMakeDirectory(); /生成目录SetDirectory(); /设置目录属性 注意: 路径有3种方式,当前目录下的相对路径、当前工作盘的相对路径、绝对路径。以C:TmpBook为例(假定当前工作目录为C:Tmp)。“Book”,“TmpBook”,“C:TmpBook”都表示C:TmpBook。 另外,在C#中 “”是特殊字符,要表示它的话需要使用“”。由于这种写法不方便,C#语言提供了对其简化。只要在字符串前加上即可直接使用“”。所以上面的路径在C#中应该表示为“Book”,“TmpBook”,“C:TmpBook”。1.5.2 文件夹管理1.5.3 文件管理1.5.4 使用文件流进行文件读写using System.IO;using System.Text;string ChatContent; if (!File.Exists(ChatContent.txt) FileStream fs=File.Create(ChatContent.txt);Fs.Close(); using (StreamReader sr = new StreamReader(ChatContent.txt, Encoding.UTF8) ChatContent = sr.ReadLine(); ChatContent += richTextBoxTalkInfo.Text; ChatContent += sr.ReadLine(); using (StreamWriter sw = new StreamWriter(ChatContent.txt, false, Encoding.UTF8) sw.Write(ChatContent); 1.6 多窗体与多线程1.6.1 多窗体MDI(Multiple-Document Interface)即多文档界面,由一个父窗体和多个子窗体组成。MDI窗体允许同时打开多个子窗体,是一种能够同时处理两个或两个以上窗体的界面形式。创建MDI窗体主要包括以下步骤: 1)MDI父窗体的创建:将IsMDIContainer属性设置为true. 2)MDI子窗体的创建 3)从父窗体中调用子窗体 Form2 Form2 = new Form2(); Form2.MdiParent = this; Form2.Show(); 4)窗体布局 LayoutMdi(MdiLayout.TileHorizontal);1.6.2 多线程1进程程序是为完成特定任务、用某种语言编写的一组指令的集合,是一段静态的代码。而进程通常被定义为一个正在运行的程序的实例,是系统进行调度和资源分配的一个独立单位。进程使用系统中的运行资源,而程序不能申请系统资源,不能被系统调度,也不能作为独立运行的单位,因此,它不占用系统的运行资源。 进程由两个部分组成。(1)操作系统用来管理进程的内核对象(Kernel object)。内核对象是系统的一种资源,系统对象一旦产生,任何应用程序都可以开启并使用该对象。系统给予内核对象一个计数值(usage count)作为管理之用。(2)操作系统用来管理地址的空间。它包含所有可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间,如线程堆栈和堆栈分配空间。进程可以简单地分为系统进程(包括一般Windows程序和服务进程)和用户进程。简单地说,凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;而用户进程就是由用户启动的进程。进程和程序所不同的是,程序是静止的,而进程是动态的。 2线程线程与进程相似,是一段完成某个特定功能的代码,是程序中的一个执行流。 线程也由两个部分组成。(1)操作系统用来管理线程的内核对象。内核对象也是系统用来存放线程统计信息的地方。(2)另一个是线程的堆栈。它用于维护线程在执行代码时需要的所有函数的参数和局部变量。线程总是在某个进程环境中创建,而且它的整个生命期都是在该进程中生存的。这意味着线程是在它的进程地址空间中执行代码的,并且在地址的进程空间中对数据进行操作。 典型的Win32应用具有两种不同类型的线程:用户界面线程(user-interface thread)和工作线程(worker thread)。用户界面线程与一个或多个窗口相关联。这些线程已有自己的消息循环以及能对用户的输入作出输入响应。工作线程用于后台处理没有相关联的窗口,通常也没有消息循环。一个应用程序有多个用户界面线程和多个工作线程。工作线程比较简单,它会去后台完成一些数据处理工作。用户可以把一些不需要用户处理的事情交给此类线程去完成,任其自生自灭。这种线程对处理后台计算、后台打印很有用。使用工作线程在后台工作是很方便的。它可以运行数据处理或进行等待。如果让它运行某种事件的发生,它也不会强迫用户和它一起等待。3线程与进程的比较一个进程就是一个执行中的程序。每一个进程都有自己独立的一块内存空间和一组系统资源。在进程概念中,每一个进程的内部数据和状态都是完全独立的。多进程是指在操作系统中能同时运行多个任务程序。线程是比进程更小的执行单位。一个进程在其执行过程中,可以产生多个线程。每个线程是进程内部一个单一的执行流。多线程则指的是在单个程序中可以同时运行多个不同的线程,执行不同的任务。多线程意味着一个程序的多行语句看上去像在同一时间内同时运行。 (1)进程的特点是允许计算机同时运行两个或更多的程序。(2)在基于线程的多任务处理环境中,线程是最小的处理单位。(3)多个进程的内部数据和状态都是完全独立的,而多线程共享一块内存空间和一组系统资源,有可能互相影响。(4)线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程的切换负担要小。 4. 线程的优点要提高对用户的响应速度并且处理所需数据以便几乎同时完成工作,使用多个线程是一种最为强大的技术。对应用程序设计人员来说,线程的好处是能够使用多个线程在应用程序中同时运行。例如,一个进程有和用户(如键盘和鼠标)交互的用户界面线程和工作线程,当用户界面线程等待用户输入时,工作线程去完成其他的任务。如果给用户界面线程更高的优先级,程序会给用户更多的响应。在没有用户输入时,工作线程可以更加有效地利用处理器。有多个线程的进程能够用线程管理互斥的任务,比如提供用户一个界面和完成后台计算。创建一个多线程的进程能够方便地让程序并发执行几个类似的或相同的任务。C#中多线程的开发 在.NET中编写的程序将被自动分配一个线程。.NET的运行时环境的主线程由Main ()方法来启动应用程序,而且.NET的编译语言有自动的垃圾收集功能,这个垃圾收集发生在另外一个线程里面,所有的这些都是在后台发生的,我们只是感觉到默认情况下,只有一个线程来完成所有的程序任务。但是更多的情况下,我们必须根据自己的需要,添加更多的线程让程序更好的协调工作。在.NET基础类库的System.Threading命名空间中,提供了大量的类和接口支持多线程程序设计所需要实现的功能,包括线程的创建、启动、停止以及多线程同步等。下面分别介绍常用的线程操作和同步技术。 1线程操作 System.Threading.Thread类是创建并控制线程,设置其优先级并获取其状态最为常用的类。该类以对象的方式封装了特定应用程序域中给定的程序执行路径,类中提供许多线程操作的常用方法。下面以Thread类为例介绍具体的线程操作方法。Thread类的常用属性属 性 名描 述CurrentThread只读属性,获取当前正在运行的线程IsAlive判断线程是否处于活动状态IsBackground获取或设置一个值,该值指示某个线程是否为后台线程IsThreadPoolThread获取一个值,该值指示线程是否属于托管线程池Name获取或设置线程的名称PriorityThreadPriority枚举类型,代表线程的优先级,如:Normal、AboveNormal、BelowNormal、Highest、LowestThreadStateThreadState枚举类型,代表当前线程的状态,如:Unstarted、Running、WaitSleepJoin、Stopped、AbortRequested、Suspended、Aborted等Thread类的常用方法方 法 名描 述GetDomain()返回当前线程所在的应用程序域GetDomainID()返回当前线程所在的应用程序域的IDStart()启动线程的执行Suspend()挂起线程,或者如果线程已挂起,则不起作用Resume()继续已挂起的线程Interrupt()终止处于Wait或者Sleep或者Join线程状态的线程Join()阻塞调用线程,直到某个线程终止时为止Sleep()将当前线程阻塞指定的毫秒数Abort()终止一个线程的运行。如果线程已经终止,则不能通过Thread.Start()来启动线程线程的控制操作一般包括以下几个方面。(1)创建线程 创建一个线程就是实例化一个Thread类的对象,Thread类的构造函数带有一个ThreadStart类型的参数,这是一个委派用于传递线程的入口方法,创建ThreadStart对象时需要一个静态方法或实例方法作为参数。示例如下:using System;using System.Collections.Generic;using System.Text;using System.Threading;namespace FirstThread class Program static void Main(string args) Thread t1 = new Thread(new ThreadStart(Thread1); /创建线程 t1.Start();/启动线程 public static void Thread1() Console.WriteLine(This is a Thread test!); (2)启动线程启动线程很简单,只需要调用Thread类的Start方法,如上例所示。(3)休眠线程线程的休眠是让当前的线程进入一定时间的休眠状态,时间一到线程将继续执行。通过Thread类的Sleep方法来实现线程的休眠。Thread类中有两个重载的Sleep方法,一个带有int类型的参数,用于指定休眠的毫秒(ms)数,另一个带有TimeSpan类型的参数,指定休眠的时间段。示例如下: Thread.Sleep(1000);/线程休眠1000毫秒TimeSpan WaitTime = new TimeSpan(0,0,0,0,1000);Thread.Sleep(WaitTime);/线程休眠按天 小时 分钟 秒 毫秒计算(4)挂起线程线程的挂起是暂停线程,如果不再启动线程,它将永远保持暂停状态。只有当前运行的线程才可以被挂起,对已经挂起的线程实施挂起没有作用,因此在使用Supend方法前,一般要先检查该线程是否正在运行。通常是查询Thread的ThreadState属性值。示例如下: if (t1.ThreadState = ThreadState.Running)/判断线程是否正在运行 t1.Suspend();(5)继续线程已经挂起的线程可以使用Thread类的Resume方法继续运行。如果没有被挂起的线程使用该操作将不起作用,所以使用Resume方法前,一般也先判断线程是否已经被挂起。示例如下: if (t1.ThreadState = ThreadState.Suspended)/判断线程是否已被挂起 t1.Resume();(6)终止线程在终止线程之前,一般先判断线程的IsAlive属性,确认该线程是否处于活动状态,处于活动状态的线程才可以使用Thread类的Abort方法进行终止。示例如下: if (t1.IsAlive)/判断线程是否处于活动状态 t1.Abort();1.7 帮助文件制作与应用程序的打包发布1.7.1 帮助文件的制作下载并安装qchm2.6_cn.exe,运行后主界面如下:点击文件菜单新建一个项目,在项目进行可视化编辑:(1) 新建主题:输入主题名称,选择主题图标,选择(或编辑相关页面)(2) 子主题的建立:同上,注意主题级别的调整与顺序调整。(3) 发布项目:形成.CHM文档。1.7.2 程序打包发布:下载并安装“小颖安装程序制作专家.exe”,安装后运行:对相关选项完整填写后,编译该项目,会在指定位置生成安装系统。对于VS2008生成的软件,在安装时系统要求必须有.Framework 3.5,否则会自动联网下载。 在使用控件布局的过程中,有许多控件会经常用到,可以在集成环境直接复制如菜单等控件,将其放在新的窗体中。附:系统功能界面:1. 登录界面: 2. 主界面3. 聊天界面4.内置浏览器界面:WebBrowser控件的常用方法:.Navigate(Url)方法:导航到指定的URL。.Goforward()方法:前进。.GoBack()方法:后退;.GoHome():回到本机IE设定的主页。.Stop():停止;.Refresh():刷新;通过LinkLabel访问Url:System.Diagnostics.Process.Start();主界面中搜索功能的实现:改写WebBrowser.CS,使其具备一个接受参数的功能(重载)。public WebBrowser(string Url) InitializeComponent(); webBrowser1.Navigate(Url); 查找百度搜索引擎的搜索格式:/s?wd=搜索词在代码中构造表达式:WebBrowser newbrowser = new WebBrowser(/s?wd= + comboBox1.Text); newbrowser.Show();5.邮箱管理界面6.网络存储(FTP)管理界面第二部分 C#基础编程(语法)2.1 C#数据类型C# 是强类型语言;因此每个变量和对象都必须具有声明类型。C#里面的数据类型分为两种:值类型和引用类型。2.1.1 值类型 值类型包括简单值类型和复合型类型。简单值类型可以再细分为整数类型、字符类型、实数类型和布尔类型;而复合类型则是简单类型的复合,包括结构(struct)类型和枚举(enum)类型。整数类型数据类型说明取值范围对应于System程序集中的结构sbyte有符号8位整数-128-127SBytebyte无符号8位整数0-255Byteshort有符号16位整数-32768-32767Int16ushort无符号16位整数0-65535UInt16Int有符号32位整数-2147489648-2147483647Int32uint无符号32位整数0-42994967295UInt32long有符号64位整数-263-263Int64ulong无符号64位整数0-264UInt64字符类型C#中采用Unicode字符集来表示字符类型。实数

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论