说明:一个C#程序称为多线程的能够经过2种方式:明确地建立和运行多线程,或者使用.NET framework的暗中使用了多线程的特性——好比BackgroundWorker类, 线程池,threading timer,远程服务器,或Web Services或ASP.NET程序。在后面的状况,人们别无选择,必须使用多线程;一个单线程的ASP.NET web server不是太酷,即便有这样的事情;幸运的是,应用服务器中多线程是至关广泛的;惟一值得关心的是提供适当锁机制的静态变量问题。程序员
1、多线程的优势: web
多线程处理能够同时运行多个线程。因为多线程应用程序将程序划分红多个独立的任务,所以能够在如下方面显著提升性能:
(1)多线程技术使程序的响应速度更快 ,由于用户界面能够在进行其它工做的同时一直处于活动状态;数据库
(2)当前没有进行处理的任务时能够将处理器时间让给其它任务;数组
(3)占用大量处理时间的任务能够按期将处理器时间让给其它任务;服务器
(4)能够随时中止任务;多线程
(5)能够分别设置各个任务的优先级以优化性能性能
2、多线程的缺点:优化
(1) 线程也是程序,因此线程须要占用内存,线程越多占用内存也越多;操作系统
(2)多线程须要协调和管理,因此须要CPU时间跟踪线程; 线程
(3)线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
(4)线程太多会致使控制太复杂,最终可能形成不少Bug;
3、何时使用多线程
(1)耗时或大量占用处理器的任务阻塞用户界面操做;
多线程程序通常被用来在后台执行耗时的任务。主线程保持运行,而且工做线程作它的后台工做。对于Windows Forms程序来讲,若是主线程试图执行冗长的操做,键盘和鼠标的操做会变的迟钝,程序也会失去响应。因为这个缘由,应该在工做线程中运行一个耗时任务时添加一个工做线程,即便在主线程上有一个有好的提示“处理中...”,以防止工做没法继续。这就避免了程序出现由操做系统提示的“没有相应”,来诱使用户强制结束程序的进程而致使错误。模式对话框还容许实现“取消”功能,容许继续接收事件,而实际的任务已被工做线程完成。BackgroundWorker刚好能够辅助完成这一功能。
(2)各个任务必须等待外部资源 (如远程文件或 Internet链接)。
在没有用户界面的程序里,好比说Windows Service, 多线程在当一个任务有潜在的耗时,由于它在等待另台电脑的响应(好比一个应用服务器,数据库服务器,或者一个客户端)的实现特别有意义。用工做线程完成任务意味着主线程能够当即作其它的事情。
4、何时不使用多线程
一样的 ,多线程也存在许多缺点 ,在考虑多线程时须要进行充分的考虑。多线程的主要缺点包括:
(1)等候使用共享资源时形成程序的运行速度变慢。这些共享资源主要是独占性的资源 ,如打印机等。
(2)对线程进行管理要求额外的 CPU开销。线程的使用会给系统带来上下文切换的额外负担。当这种负担超过必定程度时,多线程的特色主要表如今其缺点上,好比用独立的线程来更新数组内每一个元素。
(3)线程的死锁。即较长时间的等待或资源竞争以及死锁等多线程症状。
(4)对公有变量的同时读或写。当多个线程须要对公有变量进行写操做时,后一个线程每每会修改掉前一个线程存放的数据,从而使前一个线程的参数被修改;另外 ,当公用变量的读写操做是非原子性时,在不一样的机器上,中断时间的不肯定性,会致使数据在一个线程内的操做产生错误,从而产生莫名其妙的错误,而这种错误是程序员没法预知的。