c网络应用编程进程与线程

上传人:cel****460 文档编号:243712577 上传时间:2024-09-29 格式:PPTX 页数:53 大小:631.93KB
返回 下载 相关 举报
c网络应用编程进程与线程_第1页
第1页 / 共53页
c网络应用编程进程与线程_第2页
第2页 / 共53页
c网络应用编程进程与线程_第3页
第3页 / 共53页
点击查看更多>>
资源描述
主标题12,一级标题12,二级标题12,52,主标题12,一级标题12,二级标题12,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,c网络应用编程进程与线程,本章重点,本章教学目的,通过对进程、线程根本知识以及BackGroundWork组件的介绍,使学生对相关内容有一个感性认识。,本章教学要求,1掌握进程查看、启动、停顿的根本方法;,2掌握线程创立、启动、终止的根本方法;,3掌握开辟多线程的根本方法;,4掌握在一个线程中引用其他线程中的控件的方法;,5了解其他内容。,2.1 进程与线程的根本概念,进程,正在执行的程序称为进程。,与进程相关的信息包括:进程标示进程ID、文件名、执行的程序和数据,运行时间、在存储器中的位置、占用的内存容量等。,线程,将一个进程划分为假设干个独立的执行流,每一个执行流均称为一个线程。,1线程是CPU调度和分配的根本单位。,2每个进程都有一个主线程。,3除了主线程以外,还可以给一个进程分配假设干个子线程,从而到达多个任务并行执行的目的。,2.2 进程管理Process类,1、Process类位于命名空间下。,2、对本机也叫本地计算机,1可以启动、终止某个进程,2可以查看进程相关信息,如CPU利用率等,3可以查看进程工作状态,3、对远程计算机,1可以查看远程计算机相关信息,2无法直接启动、终止远程计算机,4、在一个程序中处理其他的程序例如调用其他.exe文件、,快捷方式等,实际上就是对进程进展管理。,2.2 进程管理Process类,Process,类提供的静态方法,2.2 进程管理Process类,5、Process类常用的属性和方法,-获取进程实例-,GetProcessById方法静态方法:通过进程Id创立新的Process组件,并将其与本地计算机上的进程资源关联。 GetProcessById最多只有一个Process实例。,GetProcesses方法静态方法:获取本机所有进程,GetProcessesByName方法静态方法:获取本机上特定名称的进程,-获取及设置优先级-,BasePriority属性: 获取进程优先级只读,PriorityClass 属性:设置或更改进程优先级,2.2 进程管理Process类,-进程ID及进程名-,Id属性:获取关联进程的唯一标识符,ProcessName属性:获取该进程的名称,不包括路径和扩展名,-进程其他信息-,MachineName属性:获取关联进程正在其上运行的计算机名称,MainModule属性:获取关联进程的主模块,Modules属性:获取由关联进程加载的模块,TotalProcessorTime属性:获取进程的总的处理器时间,StartTime属性:获取关联进程的启动时间,WorkingSet64属性:为进程分配的物理内存量字节数,1.2 Process,类,-进程启动-,Start方法:启动进程资源并将其与Process组件关联,StartInfo属性:获取或设置要传递给启动进程的文件名以及启动参数,-进程终止-,Kill方法:强制终止进程,CloseMainWindow方法:关闭具有用户界面的进程,Close方法:释放与此组件关联的所有资源,HasExited属性:指示关联进程是否已终止,WaitForExit方法:设置等待关联进程退出的时间,并在该段时间完毕前或该进程退出前,阻止当前线程执行。,2,.2.1 获取进程信息,1、如何获取进程信息,1获取本地计算机的所有进程:,Process myProcesses = Process.GetProcesses();,2获取本地计算机上指定名称的进程:,Process myProcesses =,Process.GetProcessesByName(进程名称);,注意:a进程名称不带扩展名。,b可以是任何一个可执行文件,例如:,Process myProcesses =,Process.GetProcessesByName (“WindowApplication1);,2.2.1 获取进程信息续,3获取远程计算机的所有进程:,Process myProcesses =,Process.GetProcesses (remoteMachineName);,例如:,Process myProcesses =,4获取远程计算机上指定名称的进程:,Process myProcesses =,Process.GetProcessesByName(,远程进程名称,remoteMachineName);,程序举例,【,例,2-1】,【例2-1】观察本机运行的所有进程,并显示进程相关的信息。,要求:,1用DataGridView显示所有进程信息,2鼠标单击DataGridView某处时,判断单击的是否为行开头或者某个单元格,如果是,显示该行进程的详细信息,运行效果见下页图,续,运行效果ProcessMonitor:,启动和停顿进程,1. 启动进程:,方法1:,1创立一个Process组件的实例,例如:,Process myProcess = new Process();,2设置其对应的StartInfo属性,指定要运行的应用程序名以及传递的参数:,文件名;,参数;,如果该进程带有图形用户界面,也可以指定图形用户界面的翻开方式。例如:,3调用该实例的Start方法启动该进程。,方法2:,直接调用Process类提供的静态方法启动进程。,启动和停顿进程续,2. 停顿进程,通过两种方法利用Process组件停顿进程。,1如果进程有图形用户界面,调用CloseMainWindow方法。,2如果进程没有用户界面,调用进程的Kill方法。,不管有没有图形用户界面,如果希望强行让其退出,在权限允许的情况下,均可以调用Kill方法终止该进程。,程序举例,【,例,2-2】,【例2-2】启动、停顿和观察Notepad进程。,StartStopProcess要求:,1用ListView显示“记事本进程信息。,2用Process类提供的静态方法启动进程。,3终止进程时,把所有“记事本进程全部终止。,工程中的应用:在程序中执行sql文件,说明:是SQL Server提供的一个工具,可以利用该工具添加、删除数据库用户,修改用户登录密码,附加、别离数据库等。对于通过程序管理数据库很有用。,public void ExecuteSqlFile(string strFileName), Process SqlProcess=new Process();,;,-U sa -P sa123 -d mydb -i+ strFileName;,ProcessWindowStyle.Hidden;,SqlProcess.Start();,SqlProcess.WaitForExit();,SqlProcess.Close(); ,2.3 线程管理Thread类,前台线程与后台线程,线程根本操作,关键字,在一个线程中操作另一个线程的控件,2.3 线程管理Thread类,Thread类位于命名空间下。,Thread类是用于创立和控制线程的,对线程的常用操作有:启动线程、终止线程、合并线程和让线程休眠等。,Thread类提供的常用属性,IsAlive属性:获取一个值,该值指示当前线程的执行状态。如果此线程已启动并且尚未正常终止,那么为true;否那么为false,IsBackground属性:获取或设置一个值,该值指示某个线程是否为后台线程。是后台线程或即将成为后台线程,那么为true;否那么为false,Priority属性:获取或设置一个值,该值指示线程的调度优先级,2.3 线程管理Thread类续,Thread类提供的常用方法,Start方法:启动线程,Join方法:将指定的线程合并到当前线程中,并阻止当前线程执行,直到指定的线程终止或经过了指定的时间为止,Sleep方法:将当前线程阻止指定的毫秒数,零(0)表示应挂起此线程以使其他等待线程能够执行,Abort方法:在调用此方法的线程上引发ThreadAbortException,以开场终止此线程的过程。调用此方法通常会终止线程,前台线程与后台线程,一个线程要么是后台线程要么是前台线程。,后台线程与前台线程类似,区别是后台线程不会影响进程终止。属于某个进程的所有前台线程都终止后,公共语言运行库就会完毕该进程,而且所有属于该进程的后台线程也都会立即停顿,而不管后台工作是否完成。,利用Thread对象的IsBackground属性,可以设置或判断一个线程是后台线程还是前台线程。,通过将某个线程的IsBackground属性设置为true,使其变为后台线程。,默认情况下,属于托管线程池的线程即其IsThreadPoolThread属性为true的线程都是后台线程,通过创立并启动新的Thread对象而生成的线程都是前台线程。,线程的根本操作,1.启动线程,启动线程前,首先要创立一个线程。,创立无参数线程的一般形式为:,Thread t1 = new Thread(线程名);,创立带参数线程的一般形式为传递一个Object类型的参数:,Thread t2 = new Thread(线程名(Object obj);,对于不止一个参数的情况,可以先将这些参数封装到一个类中,然后传递该类的实例,在线程中,再通过该实例访问相应的数据,从而到达启动线程时传递多个参数的目的。,创立线程实例后,就可以调用Start方法启动线程了。例如:,t1.Start(); /不带参数,t2.Start(“myClass); /带参数,注意:,调用Start只是告诉系统启动该线程,但是系统并不一定会立即启动它。,线程的根本操作,2.终止线程,两种方法:,事先设置一个布尔字段,在其他线程中通过修改该布尔量的值作为传递给该线程是否需要终止的判断条件,而在该线程中循环判断该布尔值,以确定是否退出线程,这是完毕线程比较好的方法,实际应用中一般使用这种方法。,调用Thread类的Abort方法,该方法的最终效果是强行终止线程。,线程的根本操作,3. 暂停线程,在多线程应用程序中,有时候并不希望某一个线程继续执行,而是希望该线程暂停一段时间,这样,CPU就会将其时间片中剩余的局部让给另一个线程。,调用Thread类的Sleep方法可以实现这个功能。例如:,Thread.Sleep(1000);,这条语句的功能是让当前线程暂停1000毫秒。,注意,Sleep方法是静态方法,暂停的是该语句所在的线程,而不是其他线程。,线程的根本操作,4.合并线程,Join方法用于把指定的线程合并到当前线程中,从而使其变为一个单个的线程。,如果一个线程t1在执行的过程中需要等待另一个线程t2完毕后才能继续执行,可以在t1的代码块中调用t2的join方法。例如:,t2.Join();,功能:t1在执行到t2.Join()语句后,就处于暂停状态,直到t2完毕后才会继续执行。,为了防止t1一直等待,可以在调用t2的Join方法的时候指定一个暂停时间,例如:t2.Join(100);,volatile修饰符表示所声明的字段可以被多个并发执行的线程修改。如果某个字段声明包含volatile关键字,那么该字段将不再被编译器优化。这样可以确保该字段在任何时间呈现的都是最新的值。,对于由多个线程访问的字段,而且该字段没有用lock语句对访问进展序列化,声明字段时应该使用volatile修饰符。,volatile修饰符只能包含在类或构造的字段声明中,不能将局部变量声明为volatile。,在布尔型字段的声明中,添加volatile修饰符的方法如下:,public volatile bool shouldStop;,volatile修饰符可应用于以下类型:,1引用类型。,2指针类型在不平安的上下文中。,3整型,如sbyte、byte、short、ushort、int、uint、char、float和bool。,4具有整数基类型的枚举类型。,5为引用类型的泛型类型参数。,6IntPtr和UIntPtr。,在一个线程中操作另一个线程的控件,默认情况下,在Windows应用程序中,.NET Framework不允许在一个线程中直接操作另一个线程中的控件,这是因为访问Windows窗体控件本质上不是线程平安的。,在应用程序中,如果创立某控件的线程之外的其他线程试图调用该控件,那么系统会引发一个InvalidOperationException异常。,有两种方法可以解决这个问题:,1使用委托delegate操作另一个线程中的控件,2用BackgroundWorker组件在后台执行线程,在一个线程中操作另一个线程的控件续,利用委托调用另一个线程控件方法1,不易理解:,delegate void AppendStringDelegate(string str);,private void AppendString(string str),if(richTextBox1.InvokeRequired),AppendStringDelegate d = AppendString;,richTextBox1.Invoke(d, str); ,else, richTextBox1.Text += str; ,利用委托调用另一个线程控件方法2,容易理解:,private delegate void AppendStringDelegate(string str);,public void AppendString(string str),richTextBox1.BeginInvoke(,new AppendStringDelegate (AddMessageToRichTextBox),new Objectmessage);,private void AddMessageToRichTextBox(string message), richTextBox1.AppendText(message); ,程序举例【例2-3】,【例2-3】在Class1类中声明两个方法Method1和Method2,其中Method1不停地输出字符“a,Method2不停地输出字符“b,在Form1中启动线程执行Method1和Method2,并在RichTextBox中显示线程输出的字符。ThreadExample,2.4,线程同步与线程池,线程的优先级,线程同步,语句,线程池,线程的优先级,五个优先级,由高到低分别是:Highest、AboveNormal、Normal默认、BelowNormal和Lowest,可以使用下面的方法为其赋予较高的优先级:,Thread t = new Thread(MethodName);,t.priority = ThreadPriority.AboveNormal;,通过设置线程的优先级可以改变线程的执行顺序,所设置的优先级仅仅适用于这些线程所属的进程。,注意:,当把某线程的优先级设置为Highest时,系统正在运行的其他线程都会终止,所以使用这个优先级别时要特别小心。,线程同步,同步,指多个线程之间存在先后执行顺序的关联关系。,哪些资源需要同步,系统资源如通信端口,多个进程所共享的资源如文件句柄,由多个线程访问的单个应用程序域的资源如全局、静态和实例字段,为什么要同步,当两个线程t1和t2有一样的优先级,并且同时在系统上运行时,如果先把时间片分给t1使用,它在构造s1中该构造中有多个变量写入某些值,但如果在时间片用完时它仍没有完成写入,这时由于时间片已经分给t2使用,而t2又恰好要尝试读取该构造的值,此时读出的就不是正确的值。这种情况下,如果使用同步仅允许一个线程使用s1,在该线程完成对s1的写入工作后再让t2读取这个构造值,就可以防止出现此类错误。,解决方法,:,命名空间提供了多个用于同步线程的类这些类包括,Mutex,、,Monitor,、,Interlocked,和,AutoResetEvent,。,在实际应用中,经常使用,lock,语句,完成线程同步。,该语句简化了编程的复杂性,使程序看起来既清晰又简洁,语句,lock语句的功能,lock语句可以有效地实现同步,即将代码段语句块标记为临界区。它能确保当一个线程位于代码的临界区可以理解为一段代码时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码段,那么它将一直等待即被阻塞,直到锁定的对象被释放以后才能进入临界区。,lock语句的用法,首先利用lock语句锁定某一个对象,然后执行代码段中的语句,等代码段中的语句执行完毕后,再释放该对象。,private Object obj = new Object();,lock(obj),/临界区中的代码,语句续,使用lock语句应注意的问题:,锁定的对象名上面代码中的obj一般声明为Object类型,不要将其声明为值类型。,锁定的对象名不能将其声明为public,只能为private,临界区中的代码一般不宜太多。,程序举例【例2-4】,【例2-4】lock语句用法举例:多线程随机取款。,相当于某公司派多人在多台自动取款机上同时取款,运行效果:lockExample,正确的运行结果 错误的运行结果,线程池,背景:,1无限制的创立线程消耗系统资源,2创立线程、回收线程均需要时间,线程池:是在后台执行多个任务的线程集合。,1最大线程数限制。如果所有线程都繁忙,那么额外的任务将放入等待队列中,直到有线程可用时才能够得到处理。,2最小线程数=创立线程池时应立即启动的数目,3一旦池中的某个线程完成任务,它将返回到等待线程队列中,等待被再次使用。这种重用使应用程序可以防止为每个任务创立新线程引起的资源和时间消耗。,4一项工作任务被参加到线程池的队列中,就不能取消该任务,直到该任务完成。,线程池的默认大小:每个可用处理器25个线程。,每个进程都有一个线程池。,为什么要用线程池?,降低系统开销,可以重用资源,使应用程序可以防止为每个任务创立新线程引起的资源和时间消耗。,什么情况下才使用线程池?,后台执行,而且不同线程没有优先级区别,适用于需要多个线程而实际执行时间又不多的场合,没有导致线程长时间被阻塞的任务对于可能长时间被阻塞的任务,应该创立单独的线程处理,不应该使用线程池,这是因为线程池具有最大线程数限制,大量阻塞的线程池线程可能会阻止任务启动,ThreadPool类位于命名空间下。,ThreadPool提供了对线程池的操作静态方法,例如:发送工作项、处理异步I/O、设置线程数目等,ThreadPool是一个静态类,托管线程池中的线程为后台线程,即它们的IsBackground属性为true。这意味着在所有的前台线程都已退出后,ThreadPool线程也会自动退出,GetAvailableThreads,方法:检索由,GetMaxThreads,返回的线程池线程的最大数目和当前活动数目之间的差值,GetMaxThreads,方法:检索可以同时处于活动状态的线程池请求的数目。所有大于此数目的请求将保持排队状态,直到线程池线程变为可用,GetMinThreads,方法:检索线程池在新请求预测中维护的空闲线程数,SetMaxThreads,方法:可以同时处于活动状态的线程池的请求数目。所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。,SetMinThreads,方法,:,设置线程池在新请求预测中维护的空闲线程数,QueueUserWorkItem方法功能:,功能:请求线程池处理一个任务或者工作项,运行时线程池会自动为每一个任务创立线程并且在任务释放时释放线程。,语法:带一个WaitCallback委托的参数,这个参数包装了要完成的任务,Public static bool QueueUserWorkItem,( WaitCallback callBack, object state),Public static bool QueueUserWorkItem,( WaitCallback callBack),参数:,state:包含方法所用数据的对象,callBack,它表示要执行的方法,例如:,ThreadPool.QueueUserWorkItem(new WaitCallback(方法名),Object参数);,ThreadPool.QueueUserWorkItem(new WaitCallback(方法名);,P41 例子,2.5 BackgroundWorker,组件,功能:提供了在后台执行耗时操作的功能,利用它既能在后台线程中与界面交互,又能有效地处理资源争用等并发冲突。,创立方式:,通过编程方式创立BackgroundWorker,从【工具箱】的“组件选项卡中拖到窗体上。如果在Windows窗体设计BackgroundWorker,那么它会出现在组件栏中,而且它的属性会显示在【属性】窗口中。,2.5 BackgroundWorker组件,常用属性、方法和事件,CancellationPending属性:指示是否已请求取消后台操作,IsBusy属性:指示是否正在进展异步操作,WorkerReportsProgress属性:指示能否报告进度更新,WorkerSupportsCancellation属性:是否支持异步取消,CancelAsync方法:请求取消挂起的后台操作,ReportProgress方法:引发ProgressChanged事件,RunWorkerAsync方法:执行后台操作,DoWork事件:调用RunWorkerAsync时发生,ProgressChanged事件:调用ReportProgress时发生,RunWorkerCompleted事件:后台操作已完成、被取消或引发异常时发生,2.5 BackgroundWorker组件,2.5 BackgroundWorker组件,2.5 BackgroundWorker组件续,用法:,在DoWork事件中调用耗时的处理程序线程处理程序。,调用RunWorkerAsync方法启动线程触发事件。,在ProgressChanged事件中显示操作信息相当于操作另一个线程的控件,在RunWorkerCompleted事件中处理操作完成时显示的内容,程序举例【例2-5】,【例2-5】利用BackgroundWorker组件执行后台线程。后台线程不停地产生10000以内的随机整数,同时判断产生的这个随机数是否能被5整除,如果该数能被5整除,在主窗体的RichTextBox中显示这个数。操作界面可以启动后台线程,也可以停顿后台线程。,注意:,1如何利用BackgroundWorker组件执行方法,并给方法传递参数信息。,2如何在界面中提示进度信息,3通过什么事件可以知道BackgroundWork组件执行的方法已经运行完毕。,4如何取消BackgroundWorker方法的执行。,程序举例【例2-5】,本章作业及实验,习题: 习题1、习题2、习题3、习题4,实验:预习实验一,谢谢大家!,结 语,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 压缩资料 > 药学课件


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!