并发编程

文章目录


并发:同时做多件事情
终端用户程序利用并发功能,在输入数据库的同时响应用户输入
服务器应用利用并发,在处理第一个请求的同时响应第二个请求
只要你希望程序同时做多件事情,你就需要并发。

多线程:并发的一种形式,它采用多个线程来执行程序
多线程是并发的一种形式,但是不是唯一的形式。实际上,直接使用底层线程类型在现代程序中基本不起作用。比起老式的多线程机制,采用高级的抽象机制会让程序功能更加强大,效率更高。

线程池:存放任务的队列,这个队列能够根据需要自行调整。相应的,线程池产生了另一个重要的并发形式,并行处理。

并行处理:把正在执行的大量的任务分割成小块,分配给多个同时运行的线程。
为了让处理器的利用效率最大化,并行处理(或并行编程)采用多线程。当现代多核CPU执行大量任务时,若只用一个核执行所有任务,而其他核保持空闲,这显然是不合理的。并行处理把任务分割成小块并分配给多个线程,让它们在不同的核上独立运行。

并行处理是多线程的一种,而多线程是并发的一种。在现代程序中,还有一种非常重要但很多人还不熟悉的并发类型,异步编程。

异步编程:并发的一种形式,它采用future模式或回调(callback)机制,以避免产生不必要的线程。
一个future(或promise)类型代表一些即将完成的操作。在.Net中,新版future类型有Task和Task。在老式异步编程API中,采用回调或事件event,而不是future。异步编程的核心理念是异步操作:启动了这个操作的线程,可以继续执行其他任务。当操作完成时,会通知它的future,或者调用回调函数,以便让程序知道操作已经结束。

异步编程是一种功能强大的并发形式,但直至不久前,实现异步编程仍需要特别复杂的代码。VS2012支持async和await,折让异步编程变得几乎和同步(非并发)编程一样容易。

并发编程的另一种形式是响应式编程(reactive programming)。异步编程意味着程序启动一个操作,而该操作将会在一段时间后完成。响应式编程与异步编程非常类似,不过它是基于异步事件(asynchronous event)的,而不是异步操作(asynchronous operation)。异步事件可以没有一个实际的“开始”,可以在任何时间发生,并且可以发生多次,例如用户输入。

响应式编程:一种声明式的编程模式,程序在该模式中对事件做出响应。
如果把一个程序看作是一个大型的状态机,则该程序的行为便可视为它对一系列事件做出响应,即每换一个事件,它就更新一次自己的状态。这听起来很抽象很空洞,但实际上并非如此。利用现代的程序框架,响应式编程已经在实际开发中广泛使用。响应式编程不一定是并发的,但它与并发编程练紧密,因此本书介绍了响应式编程的基础知识。

通常情况下,一个并发程序要使用多种技术。大多数程序至少使用了多线程(通过线程池)和异步编程。要大胆地把各种并发编程形式进行混合和匹配,在程序的各个部分使用合适的工具。

1.2 异步编程简介

异步编程有两大好处。第一个好处是对于面向终端客户的GUI程序:异步编程提高了相应能力。我们都遇到过在运行时会临时锁定界面的程序,异步编程可以使程序在执行任务时仍能响应用户的输入。第二个好处是对于服务器端应用:异步编程实现了可扩展性。服务器应用可以利用线程池满足其可扩展性,使用异步编程后,可扩展性通常可以提高一个数量级。

现代的异步.NET程序使用两个关键字:async和await。async关键字加在方法声明上,它的主要目的是使方法内的await关键字生效(为了保持向后兼容,同时引入了这两个关键字)。如果async方法有返回值,应返回Task;如果没有返回值,应返回Task。这些task类型相当于future,用来在异步方法结束时通知主程序。

不要用void作为async的返回类型!async方法可以返回void,但是这仅限于编写事务处的程序。一个普通的async方法如果没有返回值,要返回Task,而不是void。

有了上述知识背景,我们来快速看一个例子:

async Task DoSomethingAsync()
{
	int val=13;
	//异步方式等待1秒
	await Task.Delay(TimeSpan.FromSeconds(1));
	val *=2;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值