在事情中经常遇到需要并发编程的实例,一直没有时间来整理,此刻空了下来,小我私家整理对并发一下理解。
关于并发编程的几个误解误解一:并发编程就是多线程
实际上多线只是并发编程的一中形式,在C#中还有很多更实用、更便利的并发编程技术,包孕异步编程、并行编程、TPL数据流、响应式编程等。
误解二:只有大型处事器措施才需要考虑并发
处事器真个大型措施要响应大量客户真个数据请求,固然要丰裕考虑并发。但是桌面措施和手机、平板等移动端应用同样需要考虑并发编程,因为它们是直接面向最终用户的,而此刻用户对使用体验的要求越来越高。措施必需能随时响应用户的操纵,尤其是在后台措置惩罚惩罚时(读写数据、与处事器通信等),这正是并发编程的目的之一。
误解三:并发编程很庞大、必需掌握很多底层技术
C# 和 .NET 供给了很多措施库,并发编程已经变得简单多了。尤其是 .NET 4.5 推出了全新的 async 和 await 关键字,使并发编程的代码减少到了最低限度。
最简单明了的解释:同时做多件工作,这个解释表白了并发的感化,处事器应用操作并发就,在措置惩罚惩罚第一个请求的同时响应第二个请求。只要你但愿措施能同时做多件工作,你就需要并发。所以几乎每个软件措施城市受益于并发。
多线程很多人看到并发 就会想到多线程 ,这里解释一下,多线程它只是并发的一种形式,它给与多个线程来执行措施,此中分为主线程和子线程之分。执行措施的第一句话就会开启一个主线程,,主线程可以创建子线程来实现并发。多线程是并发的一种形式,但不是独一的形式。实际上,直接使用底层线程类型在现代措施根基不起感化。比起老式多线程,给与高级抽象机制会让成果越发强大。效率更高。这里也就是不会再使用Thread或BackgroundWorker。好比你的代码输入new Thead(),说明项目中的代码过时了。但是,不要认为多线程已经彻底被裁减了!因为线程池要求多线程继续存在。线程池存放任务的行列队伍,这个行列队伍能够按照需要自行调解。相应地,线程池孕育产生了另一个重要的并发形式:并行措置惩罚惩罚
并行措置惩罚惩罚把正在执行的大量的任务支解成小块,分配给多个同时运行的线程。为了让措置惩罚惩罚器的操作效率最大化,并行措置惩罚惩罚(或并行编程)给与多线程。当现代多核 CPU执行大量任务时,若只用一个核执行所有任务,而其他核连结空闲,这显然是不同理的。并行措置惩罚惩罚把任务支解成小块并分配给多个线程,让它们在差此外核上独立运行。并行措置惩罚惩罚是多线程的一种,而多线程是并发的一种。在现代措施中,还有一种非常重要但很多人还不熟悉的并发类型:异步编程
异步编程并发的一种形式,和多线程同级,它一般给与回调(callback)机制,以制止孕育产生不须要的线程。
在.NET中,新版有Task和Task.以前一般是回调或事件event.异步编程的核心理念是异步操纵:启动了的操纵将会在一段时间后完成。这个操纵正在执行时,不会梗阻本来的线程。启动了这个操纵的线程,可以继续执行其他任务。当操纵完成时,会通知他的回调函数,以便让措施知道操纵已经结束NET4.5已经撑持async和await,让异步变得和同步编程一样容易。await关键字的感化:启动一个将会被执行的Task(该Task将会在新线程中执行),并当即返回,所以await地址的函数不会被梗阻。当Task完成后,继续执行await关键字后面的代码
一种声明式的编程模式,措施在该模式中对事件做出响应。如果把一个措施看作一个大型的状态机,则该措施的行为便可视为它对一系列事件做出响应,即每换一个事件,它就更新一次本身的状态。这听起来很抽象和浮泛,但实际上并非如此。操作现代的措施框架,响应式编程已经在实际开发中广泛使用。响应式编程不必然是并发的,但它与并发编程联系紧密。
凡是情况下,一个并发措施要使用多种技术。大大都措施至少使用了多线程(通过线程池)和异步编程。要斗胆地把各类并发编程形式进行混合和匹配,在措施的各个部分使用合适的工具。