C#中异步和多线程
区别是什么呢?异步和多线程两者都可以达到避免
线程阻塞
目
从而提高软件Software
可响应性
甚至有些时候我们就认为异步和多线程是等同
概念
但是
异步和多线程还是有
些区别
而这些区别造成了使用异步和多线程
时机
区别
异步和多线程区别的异步操作本质
所有
最终都会由计算机硬件来执行
所以为了更好
理解异步操作
本质
我们有必要了解
下它
硬件基础
熟悉电脑硬件
朋友肯定对DMA这个词不陌生
硬盘、光驱
技术规格中都有明确DMA
模式指标
其实网卡、声卡、显卡也是有DMA功能
DMA就是直 接内存访问
意思
也就是说
拥有DMA功能
硬件在和内存进行数据交换
时候可以不消耗CPU资源
只要CPU在发起数据传输时发送
个指令
硬件就开 始自己和内存交换数据
在传输完成的后硬件会触发
个中断来通知操作完成
这些无须消耗CPU时间
I/O操作正是异步操作
硬件基础
所以即使在DOS 这样
单进程(而且无线程概念)系统中也同样可以发起异步
DMA操作
异步和多线程区别的线程本质
线程不是
个计算机硬件
功能
而是操作系统提供
种逻辑功能
线程本质上是进程中
段并发运行
代码
所以线程需要操作系统投入CPU资源来运行和调度
异步和多线程区别的异步操作优缺点
异步操作无须额外
线程负担
并且使用回调
方式进行处理
在设计良好
情况下
处理
可以不必使用共享变量(即使无法完全不用
最起码可以减少 共享变量
数量)
减少了死锁
可能
当然异步操作也并非完美无暇
编写异步操作
复杂程度较高
主要使用回调方式进行处理
和普通人
思维方式有些 初入
而且难以调试
异步和多线程区别的多线程优缺点
多线程
优点很明显
线程中
处理
依然是顺序执行
符合普通人
思维习惯
所以编程简单
但是多线程
缺点也同样明显
线程
使用(滥用)会给系统带来上下文切换
额外负担
并且线程间
共享变量可能造成死锁
出现
适用范围
在了解了线程和异步操作各自
优缺点的后
我们可以来探讨
下线程和异步
合理用途
我认为:当需要执行I/O操作时
使用异步操作比使用线程+同步 I/O操作更合适
I/O操作不仅包括了直接
文件、网络
读写
还包括数据库操作、Web Service、HttpRequest以及.net Remoting等跨进程
而线程
适用范围则是那种需要长时间CPU运算
场合
例如耗时较长
图形处理和算法执行
但是往 往由于使用线程编程
简单和符合习惯
所以很多朋友往往会使用线程来执行耗时较长
I/O操作
这样在只有少数几个并发操作
时候还无伤大雅
如果需要处 理大量
并发操作时就不合适了
异步和多线程区别例子研究
说了那么理论上
东西
可能有些兄弟早就不耐烦了
现在我们来研究几个实际
异步操作例子吧
异步和多线程
区别例子:由delegate产生
异步思路方法到底是如何回事?
大家可能都知道
使用delegate可以“自动”使
个思路方法可以进行异步
从直觉上来说
我觉得是由编译器或者CLR使用了另外
线程来执行目标思路方法
到底是不是这样呢?让我们来用
段代码证明
下吧
="dp-c">
="alt">
="keyword">using; ="keyword">using.Threading; ="alt">
="keyword">AsyncDelegateDemo ="alt">
{ ="keyword">delegate="keyword">voidAsyncFoo(="keyword">i); ="alt">
="keyword">
Program { ="alt">
="comment">///﹤summary﹥
="comment">///输出当前线程信息 ="alt">
="comment">///﹤/summary﹥
="comment">///﹤paramname="name"﹥思路方法名称﹤/param﹥ ="alt">
="keyword">="keyword">voidPrCurrThreadInfo(="keyword">name) ="alt">
{ Console.WriteLine(="">"ThreadIdof"+name+="">"is:"="alt">
+Thread.CurrentThread.ManagedThreadId+="
">",currentthreadis"
+(Thread.CurrentThread.IsThreadPoolThread?="">"":="">"not") ="alt">
+="
">"threadpoolthread."
); } ="alt">
="comment">///﹤summary﹥
="alt">
="comment">///测试思路方法
Sleep
定时间
="comment">///﹤/summary﹥ ="alt">
="comment">///﹤paramname="i"﹥Sleep
时间﹤/param﹥
="keyword">="keyword">voidFoo(="keyword">i) ="alt">
{ PrCurrThreadInfo(="">"Foo"); ="alt">
Thread.Sleep(i); } ="alt">
="comment">///﹤summary﹥ ="alt">
="comment">///投递
个异步
="comment">///﹤/summary﹥ ="alt">
="keyword">
="keyword">void
PostAsync { ="alt">
AsyncFoocaller=="keyword">
AsyncFoo(Foo); caller.BeginInvoke(1000, ="alt">
="keyword">
AsyncCallback(FooCallBack),caller); } ="alt">
="keyword">="keyword">voidMain(="keyword">args) ="alt">
{ PrCurrThreadInfo(="">"Main"); ="alt">
="keyword">for
(="keyword">
i=0;i﹤10;i) { ="alt">
PostAsync; } ="alt">
Console.ReadLine; } ="alt">
="keyword">="keyword">voidFooCallBack(IAsyncResultar) ="alt">
{ PrCurrThreadInfo(="">"FooCallBack"); ="alt">
AsyncFoocaller=(AsyncFoo)ar.AsyncState; caller.EndInvoke(ar); ="alt">
} } ="alt">
}
异步和多线程
区别例子代码
输出如下:
="dp-c">
="alt">
ThreadIdofMain="keyword">is:1, currentthread="keyword">isnotthreadpoolthread. ="alt">
ThreadIdofFoo="keyword">is:3, ="alt">
currentthread="keyword">is
threadpoolthread. ="alt">
ThreadIdofFooCallBack="keyword">is
:3, currentthread="keyword">isthreadpoolthread. ="alt">
ThreadIdofFoo="keyword">is:3, ="alt">
currentthread="keyword">is
threadpoolthread. ="alt">
ThreadIdofFoo="keyword">is
:4, currentthread="keyword">isthreadpoolthread. ="alt">
ThreadIdofFoo="keyword">is:5, ="alt">
currentthread="keyword">is
threadpoolthread. ="alt">
ThreadIdofFooCallBack
="keyword">is
:3, currentthread="keyword">isthreadpoolthread. ="alt">
ThreadIdofFoo="keyword">is:3,
异步和多线程
区别
基本分析内容就向你介绍到这里
希望对你了解和学习异步和多线程
区别有所帮助
延伸阅读
最新评论