c#异步和多线程有什么区别和联系?
2015-12-25 16:49
429 查看
异步和多线程可以说没有必然的联系,只能说异步可以通过多线程实现而已
要理解这些东西,你得具备很多相关的知识,操作系统原理,编译原理等
简单地来说,计算机或者说CPU执行你的代码都是顺序执行的,当前的语句没有执行完,不会执行后面的语句的,这是永远不变的规则!
但是这样的机制会使整个执行效率很低,因为CPU总是要等待当前的语句执行完毕了才会执行后面的代码,而计算机在绝多数的时候都是处于等待用户的输入,等待磁盘文件的读取完成,等待网络数据的传输完成中,所以为了提高整个系统的运行效率,提高CPU的执行效率,计算机系统引入了异步的机制。
异步机制,简单地说就是CPU不会傻傻地处于等待状态,它会先干别的事情,当它需要的东西已经准备完毕后(大多数的情况都是等待外部的输入数据准备完毕,也有些是复杂的计算完毕),硬件系统给CPU一个中断,告诉有了新的数据了,你现在可以去处理了。
这就是最基本的异步原理,而现代操作操作系统对硬件系统做了良好的封装,把很多底层机制屏蔽了,为程序的开发者提供了事件和多线程的概念,让程序的开发者可以更好地利用异步机制。
再说说多线程吧。多线程是计算机引入了操作系统之后才有的概念,至于为什么计算机要引入操作系统,在此就不叙述了,自行了解。多线程的实现有两个方法,一个就是增加CPU的核数和个数,这是最直接的方法,还有一种是采用CPU轮询的方式,每个进程都执行一段时间,又去执行另一个进程的指令,由于切换的速度非常的快,给人的感觉就是同时执行的。
说了这么多,你可能很失望,因为没有代码,没有举例。但我想说的是,用代码无法说明这个问题,不同的操作系统,不同的编程语言,不同的编程框架,对异步和多线程的定义和处理是不一样的,但原理就是这样的。
我们写代码无非就是写一堆的指令去要求CPU执行,同步的方式就是这样的:
我:hi,CPU,我要你做一件事情,而且必须立刻马上就做,因为我正在等着你。
CPU:那你就等着吧,我现在去做。
异步的方式是这样的:
我:hi,CPU,我要你做一件事情,但是不是立刻就做,你可以交给下面的人去做,或者找一个帮手来,我们继续做后面的事情.
CPU:好的,我现在通知硬件去做,等有结果了我通过事件告诉你
或者
CPU:好的,我让另一个核心来做这件事情,我们继续(其实多线程是操作系统实现的,我只是这么举个例子而已)
要理解这些东西,你得具备很多相关的知识,操作系统原理,编译原理等
简单地来说,计算机或者说CPU执行你的代码都是顺序执行的,当前的语句没有执行完,不会执行后面的语句的,这是永远不变的规则!
但是这样的机制会使整个执行效率很低,因为CPU总是要等待当前的语句执行完毕了才会执行后面的代码,而计算机在绝多数的时候都是处于等待用户的输入,等待磁盘文件的读取完成,等待网络数据的传输完成中,所以为了提高整个系统的运行效率,提高CPU的执行效率,计算机系统引入了异步的机制。
异步机制,简单地说就是CPU不会傻傻地处于等待状态,它会先干别的事情,当它需要的东西已经准备完毕后(大多数的情况都是等待外部的输入数据准备完毕,也有些是复杂的计算完毕),硬件系统给CPU一个中断,告诉有了新的数据了,你现在可以去处理了。
这就是最基本的异步原理,而现代操作操作系统对硬件系统做了良好的封装,把很多底层机制屏蔽了,为程序的开发者提供了事件和多线程的概念,让程序的开发者可以更好地利用异步机制。
再说说多线程吧。多线程是计算机引入了操作系统之后才有的概念,至于为什么计算机要引入操作系统,在此就不叙述了,自行了解。多线程的实现有两个方法,一个就是增加CPU的核数和个数,这是最直接的方法,还有一种是采用CPU轮询的方式,每个进程都执行一段时间,又去执行另一个进程的指令,由于切换的速度非常的快,给人的感觉就是同时执行的。
说了这么多,你可能很失望,因为没有代码,没有举例。但我想说的是,用代码无法说明这个问题,不同的操作系统,不同的编程语言,不同的编程框架,对异步和多线程的定义和处理是不一样的,但原理就是这样的。
我们写代码无非就是写一堆的指令去要求CPU执行,同步的方式就是这样的:
我:hi,CPU,我要你做一件事情,而且必须立刻马上就做,因为我正在等着你。
CPU:那你就等着吧,我现在去做。
异步的方式是这样的:
我:hi,CPU,我要你做一件事情,但是不是立刻就做,你可以交给下面的人去做,或者找一个帮手来,我们继续做后面的事情.
CPU:好的,我现在通知硬件去做,等有结果了我通过事件告诉你
或者
CPU:好的,我让另一个核心来做这件事情,我们继续(其实多线程是操作系统实现的,我只是这么举个例子而已)
相关文章推荐
- C#将DLL嵌入到exe当中
- C# Socket多线程编程(一)
- C#-冒泡排序和选择排序
- 跟我学做c#皮肤美化(一)(转)
- c#事件实例三
- 浅谈C# Socket编程及C#如何使用多线程
- c#事件实例二
- 零OCR基础6行代码实现C#验证码识别
- c#事件实例一
- C# TreeView的用法(递归加载节点内容)
- C# GC.Collect()
- c# 提取word文件中的图片问题
- Wix中注册c#开发的Activex控件
- C#配置升级
- 未能加载文件或程序集“ICSharpCode.SharpZipLib, Version=0.86.0.518, Culture=neutral, PublicKeyToken=1b03e6acf1164f73”或它的某一个依赖项
- C#写的COM组件注册问题兼论微软Regasm注册的BUG
- c#界面开发自定义快捷键
- 生命游戏代码(C#)
- C#接口中的属性用法
- [转]C# const和static readonly区别