10C高级应用编程 谢新冲

发布 2021-04-26 15:00:28 阅读 2536

本章介绍c#程序的高级应用,包括多线程编程、数据库编程、及web编程、xml 及web service编程、网络通讯编程、c#程序与其他程序的互操作等。

以前所介绍的程序多数是单线程的,即一个程序只有一条从头至尾的执行路线。然而现实世界中的很多过程都具有多种途径同时运作,例如服务器可能需要同时处理多个客户机的请求。在windows操作系统中,不仅多个应用程序能同时运行,而且在同一程序内部也可以有多个线程同时运行,这就是多线程。

c#语言可以方便地开发出具有多线程功能的应用程序。

程序是一段静态的**,它是应用软件执行的蓝本。

进程是应用程序的一次动态执行过程,它对应了从**加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到消亡的过程。作为执行蓝本的同一段程序,可以被多次加载到系统的不同内存区域分别执行,形成不同的进程。

线程是比进程更小的执行单位。一个进程在其执行过程中,可以产生多个线程,形成多条执行线索。每条线索有它自身的产生、存在和消亡的过程,也是一个动态的概念。

每个进程都有一段专用的内存区域,而线程间可以共享相同的内存单元(包括**与数据),并利用这些共享单元来实现数据交换、实时通信与必要的同步操作。

多线程处理可以同时运行多个任务。例如,文字处理器应用程序在处理文档的同时,可以检查拼写(作为单独的任务),或者完成打印的任务。由于多线程应用程序将程序划分成独立的任务,因此可以在以下方面显著提高性能:

1)多线程技术使程序的响应速度更快,因为用户界面可以在进行其他工作的同时一直处于活动状态。

2)当前没有进行处理的任务可以将处理器时间让给其他任务。

3)占用大量处理时间的任务可以定期将处理器时间让给其他任务。

4)可以随时停止任务。

5)可以分别设置各个任务的优先级以优化性能。

一般地说,耗时、大量占用处理器并阻塞用户界面操作的任务,或者各个任务必须等待外部资源(如远程文件或internet连接)等任务最适合用多线程来处理。

线程要用到名字空间,其中类用于表示线程。thread类最常用的一些属性和方法列举在表 101和表 102中。

表 101 thread类的常用属性。

表 102 thread类的常用方法。

thread类是一个sealed类,不能被继承,但可以创建thread类的实例。

thread类有一个构造方法,格式如下:

public thread( threadstart fun );

其中threadstart是一个指代:

public delegate void threadstart();

线程所指代的方法,称为线程方法或线程函数。线程方法不带参数,且返回void类型。如果要传递相关的信息,则可以使用对象的成员变量或方法。

下面是创建一个thread对象并启动这个线程的一般方法:

thread thread = new thread( new threadstart( )

例 101 创建多个线程。

1 using system;

2 using

3 class test

23 private int cnt = 0;

24 private void count()

程序中创建了3个线程,其中thread1在obj1上进行计数,thread2与thread3同时在obj2上进行计数,它们数到10后线程结束。这三个线程同时进行的情况,可参见图 101。

图 101 创建多个线程。

thread对象被创建后,调用线程对象的start()就可以开始执行对应的线程函数。线程函数会一直执行下去,直至它结束。可以通过它的isalive属性来检查线程的当前状态,以判定线程是否已经被撤销了。

如果希望中断一个线程,那么可以调用abort()方法。调用这个方法的时候一定要谨慎,因为这个方法只是简单地停止了一个线程的运行,别的方面并没有过多考虑。在某些情况下,线程的突然中断会导致严重的问题,因为线程函数没有机会进行必要的整理。

例如在更新数据库或者写文件操作进行到一半时发生了中断,就会造成数据的不完整。

最好使用一些标志来辅助中断处理。线程函数可以设置并检查这些标志。标志可以是一个布尔型变量,一旦它被赋值成true,线程函数中可以根据这个标志进行必要的处理后,才结束线程函数。

suspend()用于临时性地停止一个线程的执行,resume()用于对线程重新启动。这两种方法和abort()一样会遇到以上问题,最好采用标志变量的方法而不是简单地调用suspend()方法。

sleep()方法的作用是在一段时间内(通常是毫秒级的),让线程处于休眠状态。这是一种非常有用的方法,因为处于休眠状态的进程不会占用处理器的时间。处于休眠状态的进程可以被中断,例如被程序中断或者被设备中断,这时会抛出threadinterruptedexception异常。

线程状态(threadstate)是一个枚举,在表 103中描述了该枚举的成员。

表 103 threadstate的成员。

线程最初处于unstarted状态,调用了方法start()之后,状态转移至running状态。调用方法suspend()将线程置为suspended状态,并且之后调用resume()方法会将线程重新置为running状态。如果线程已经被启动并且尚且在生命周期内,那么isalive属性的返回值应该是true;如果线程处于running、background、suspended、suspendrequested以及waitsleepjoin状态,那么isalive属性同样返回true。

10c语言教程

最长上升子序列问题是各类信息学竞赛中的常见题型,也常常用来做介绍动态规划算法的引例,笔者接下来将会对poj上出现过的这类题目做一个总结,并介绍解决lis问题的两个常用算法 n 2 和 nlogn 问题描述 给出一个序列a1,a2,a3,a4,a5,a6,a7.an,求它的一个子序列 设为s1,s2,...

C 高级编程

第六章熟悉类与对象。6.1 电子 示例介绍。6.2 编写类。6.2.1 类定义。1.方法与成员。2.访问控制。3.声明的顺序。6.2.2 定义方法。1.访问数据成员。2.调用其他方法。指针。6.2.3 使用对象。1.堆栈中的对象。2.堆中的对象 6.3 对象的生命周期。6.3.1 创建对象。1.编写...

C高级编程在DCS中的应用

鼎力中控与传统dcs的不同之处。传统的dcs人机界面都是采用市面上常见的组态软件来实现的,例如西门子公司的wincc 过长的有三维力控 组态王等。下位机品牌也多种多样,但都属于plc的范畴,io 点的逻辑运算都在plc中的芯片之中完成,hmi负责显示实时状态和进行人机交互。中誉鼎力的dcs上位机hm...