赞
踩
多线程与异步是两个不同概念,之所以把这两个放在一起学习,是因为这两者虽然有区别,但也有一定联系。
多线程是一个技术概念,相对于单线程而言,多线程是多个单线程同时处理逻辑。例如,假如说一个人把水从A地提到B点可看作是单线程,那么如果两个人同时去做事(可以是相同的一件事,也可以是不同的一件事)就可以看作是两个线程。
异步:记得读书时学过一篇课文叫《统筹方法》,里面讲述煮茶喝的过程,如下:
比如,想泡壶茶喝。当时的情况是:开水没有;水壶要洗,茶壶、茶杯要洗;火已生了,茶叶也有了。怎么办?
办法甲:洗好水壶,灌上凉水,放在火上;在等待水开的时间里,洗茶壶、洗茶杯、拿茶叶;等水开了,泡茶喝。
办法乙:先做好一些准备工作,洗水壶,洗茶壶茶杯,拿茶叶;一切就绪,灌水烧水;坐待水开了,泡茶喝。
那么办法甲就是异步方法,办法乙就是同步方法。利用多线程就可以实现办法甲:如用A线程做“洗好水壶,灌上凉水,放在火上”,另B线程做“洗茶壶、洗茶杯、拿茶叶”,并在B线程中等待A线程执行完毕(即水开),再继续做“泡茶喝”。
上面是示例讲法,所谓的“等待”翻译成技术语言就是“阻塞”,异步与同步的区别就是看一事件中是否有阻塞,等待另一件事情的处理结果。从示例中也可以看到,异步中用到了多线程,但异步和多线程显然是两个不同的概念。
结论:异步是相对同步来说的一个目的,而多线程是实现这个目的一种技术方法。
Task是.NET Framework 4.5加入的概念,之前实现多线程是利用Thread类,在此只对Task进行学习,在实际编码中基本用Task,因为它比Thread更易理解,更易运用,更安全可靠。
下面是两者差异的一个总结:
1.task与thread对比,task相当于应用层,thread更底层,但二者是不一样的,没有隶属关系
2.task是在线程池上创建,是后台线程(主线程不会等其完成);Thread是单个线程,默认是前台线程
3.task可以直接获取返回值,thread不能直接从方法返回结果(可以使用变量来获取结果)
4.使用task.ContinueWith()方法可以继续执行其他任务。线程中无连续性,当线程完成工作时,不能告诉线程开始其他操作。 尽管可以使用Join()等待线程完成,但是这会阻塞主线程
5.task借助CancellationTokeSource类可以支持任务中的取消,当thread处于运行中时,无法取消它
6.task能方便捕捉到运行中的异常,thread在父方法中无法捕捉到异常
下面用示例代码来展示Task实现异步的基本运用:
1 例如有同步方法如下:
- public void aaa()
- {
- Thread.Sleep(3000);
- }
2 变为异步方法
- public void aaa()
- { //
- Task.Run(() =>
- {
- Thread.Sleep(3000);
- });
- }
3 调用普通异步方法
- public void aaa()
- {
- Task.Run(() =>
- {
- Thread.Sleep(3000);
- Console.WriteLine("异步方法1");
- });
- }
- public void bbb()
- {
- Console.WriteLine("同步方法1");
- }
- static void Main(string[] args)
- {//当调用两个方法时 虽然aaa在前但是过程比较长,但bbb会优于aaa先执行结束
- aaa();
- bbb();
- ///最终结果是 同步方法1 异步方法1
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。