黑马程序员技术交流社区

标题: .NET中的多线程技术有哪几种?其特点和适用场合是什么? [打印本页]

作者: 鬼鬼    时间: 2014-3-20 20:21
标题: .NET中的多线程技术有哪几种?其特点和适用场合是什么?
本帖最后由 鬼鬼 于 2014-3-24 20:09 编辑

看了基础和加强视频,发现关于多线程操作的内容比较少,所以问问大家,.NET里的多线程操作具体有哪几种形式(比如开辟新线程、异步调用什么的)?它们各自的特点和适用场合又是什么?
作者: cancle    时间: 2014-3-20 22:06
求涨姿势。。
作者: mdb    时间: 2014-3-21 18:46
几件事情可以同时工作时就可以开辟多个线程,提高效率,异步多出现在通信软件中,用于接收和发送数据,多线程一般用在同时执行后台数据处理和用户界面的更新的时候
作者: shangxin    时间: 2014-3-21 19:52
使用C#编写任何程序时,都有一个入口:Main()方法。程序从Main()方法的第一条语句开始执行,直到这个方法返回为止。这样的程序结构非常适合于一个可识别的任务序列的程序,但程序常常需要同时完成多个任务。例如在使用文字处理软件的时候,用户在输入文字的同时,软件能同步进行拼写检查而不需要用记的等待;再如在一个应用程序的打印功能中,如果程序只能执行一个任务序列,用户可能需要等待所有的打印任务完成后才能继续操作,这时就需要能让程序同时处理多个任务的能力。

   在上面的示例中提到的拼写检查和打印功能说明了应用程序需要处理多个任务的情形,所以最明显的解决方案是给应用程序提供多个执行线程。线程表示计算机执行的指令序列,从Windows 95操作系统开始引入了多线程机制,应用程序可以同时执行多个任务序列。每次创建一个新执行线程时,都需要指定从哪个方法开始执行。

   在C#应用程序中,第一个线程总是Main()方法,因为第一个线程是由.NET运行库开始执行的,Main()方法是.NET运行库选择的第一个方法。后续的线程由应用程序在内部启动,即应用程序可以创建和启动新的线程。



1、多线程工作方式

   一个处理器在某一刻只能处理一个任务,对于一个多处理器系统,理论上它可以同时执行多个指令——每个处理器执行一个指令,但大多数人使用的是单处理器计算机,同时执行多个指令的情况是不可能发生的。表面上Windwos操作系统上可以同时处理多个任务,这个过程称为抢先式多任务处理,所谓抢先式多任务处理,是指Windwos在某个进程中选择一个线程,该线程运行一小段时间。这个时间非常短,不会超过几毫秒。这段很短的时候称为线程的时间片。过了这个时间片后,Windows就收回控制权,选择下一个被分配了时间片的线程。这些时间非常短,我们可以认为许多事件是同时发生的。

   即使应用程序只有一个线程,抢先式多任务处理的进行也在进行,因为系统上运行了许多其他进程,每个进程都需要一定的时间片来完成其线程。当屏幕上有许多应用程序窗口时,每个窗口都代表不同的进程,可以单击它们中的任一个,让它显示响应。这种响应不是即时的,在相关进程中下一个负责处理该窗口的用户输入的线程得到一个时间片时,这种响应才会发生。如果系统非常忙,就需要等待,但这种等待的时间非常短暂,用户不会察觉到。



2、什么时候使用多线程

   应用多线程技术最大的误区在于没有分清适用的情况就盲目地使用多线程。除非运行一个多处理器计算机,否则在CPU密集的任务中使用两个线程不能节省多少时间,理解这一点是很重要的。在单处理器计算机上,让两个线程式同时进行100万次运算所花的时间与让一个线程进行200万次运算是相同的,甚至使用两个线程式所用的时间会略长,因为要处理另一个线程,操作系统必须用一定的时间切换线程,但这种区别可以忽略不计。使用线程带来的负面因素是必须额外考虑线程的并发、同步等线程安全问题,从而使得程序更加复杂而难以维护。

   有些场合则使用多线程技术非常适合,如一个服务器进程需要并发处理来自不同客户端的访问。此外,使用多个线程的优点有两个。第一,可以及时对用户操作作出响应因为一个线程在处理用户输入时,另一个线程在后台完成其他工作,本章开始时所举的拼写检查和打印的例子就是风华正茂的适合多线程技术的应用;第二,如果一个或多个线程所处理的工作不占用CPU时间时,就可以节省时间,比如在经常使用多线程技术的网络应用开发中,让一个线程等待从Internet中获取数据,同时其他线程可以继续处理其他的任务。

作者: 鬼鬼    时间: 2014-3-23 23:01
mdb 发表于 2014-3-21 18:46
几件事情可以同时工作时就可以开辟多个线程,提高效率,异步多出现在通信软件中,用于接收和发送数据,多线 ...

异步调用的实质不也是用线程池中线程执行的多线程操作么?它与手动开辟线程有什么区别呢?二者又各有什么特点呢?
作者: mdb    时间: 2014-3-24 12:37
鬼鬼 发表于 2014-3-23 23:01
异步调用的实质不也是用线程池中线程执行的多线程操作么?它与手动开辟线程有什么区别呢?二者又各有什么 ...

异步和多线程两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。

1.异步和多线程的区别之异步操作的本质:

所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们有必要了解一下它的硬件基础。 熟悉电脑硬件的朋友肯定对DMA这个词不陌生,硬盘、光驱的技术规格中都有明确DMA的模式指标,其实网卡、声卡、显卡也是有DMA功能的。DMA就是直 接内存访问的意思,也就是说,拥有DMA功能的硬件在和内存进行数据交换的时候可以不消耗CPU资源。只要CPU在发起数据传输时发送一个指令,硬件就开 始自己和内存交换数据,在传输完成之后硬件会触发一个中断来通知操作完成。这些无须消耗CPU时间的I/O操作正是异步操作的硬件基础。所以即使在DOS 这样的单进程(而且无线程概念)系统中也同样可以发起异步的DMA操作。





2.线程的本质:

线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度。



3.异步与多线程的优缺点:

   (1)多线程的优点很明显,线程中的处理程序依然是顺序执行,符合普通人的思维习惯,所以编程简单。但是多线程的缺点也同样明显,线程的使用(滥用)会给系统带来上下文切换的额外负担。并且线程间的共享变量可能造成死锁的出现。

   (2)因为异步操作无须额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下,处理函数可以不必使用共享变量(即使无法完全不用,最起码可以减少 共享变量的数量),减少了死锁的可能。当然异步操作也并非完美无暇。编写异步操作的复杂程度较高,程序主要使用回调方式进行处理,与普通人的思维方式有些 初入,而且难以调试。



4.适合场合:

   (1)当需要执行I/O操作时,使用异步操作比使用线程+同步 I/O操作更合适。I/O操作不仅包括了直接的文件、网络的读写,还包括数据库操作、Web Service、HttpRequest以及.net Remoting等跨进程的调用。

   (2)而线程的适用范围则是那种需要长时间CPU运算的场合,例如耗时较长的图形处理和算法执行。但是往 往由于使用线程编程的简单和符合习惯
作者: 鬼鬼    时间: 2014-3-24 20:09
mdb 发表于 2014-3-24 12:37
异步和多线程两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。

1.异步和多线程的区别 ...

学习了!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2