wininet异步多线程:浅析C#中异步和多线程的区别

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">
  1. ="alt">="keyword">using;
  2. ="keyword">using.Threading;
  3. ="alt">
  4. ="keyword">AsyncDelegateDemo
  5. ="alt">{
  6. ="keyword">delegate="keyword">voidAsyncFoo(="keyword">i);
  7. ="alt">="keyword">Program
  8. {
  9. ="alt">="comment">///﹤summary﹥
  10. ="comment">///输出当前线程信息
  11. ="alt">="comment">///﹤/summary﹥
  12. ="comment">///﹤paramname="name"﹥思路方法名称﹤/param﹥
  13. ="alt">
  14. ="keyword">="keyword">voidPrCurrThreadInfo(="keyword">name)
  15. ="alt">{
  16. Console.WriteLine(="">"ThreadIdof"+name+="">"is:"
  17. ="alt">+Thread.CurrentThread.ManagedThreadId+="">",currentthreadis"
  18. +(Thread.CurrentThread.IsThreadPoolThread?="">"":="">"not")
  19. ="alt">+="">"threadpoolthread.");
  20. }
  21. ="alt">
  22. ="comment">///﹤summary﹥
  23. ="alt">="comment">///测试思路方法Sleep定时间
  24. ="comment">///﹤/summary﹥
  25. ="alt">="comment">///﹤paramname="i"﹥Sleep时间﹤/param﹥
  26. ="keyword">="keyword">voidFoo(="keyword">i)
  27. ="alt">{
  28. PrCurrThreadInfo(="">"Foo");
  29. ="alt">Thread.Sleep(i);
  30. }
  31. ="alt">
  32. ="comment">///﹤summary﹥
  33. ="alt">="comment">///投递个异步
  34. ="comment">///﹤/summary﹥
  35. ="alt">="keyword">="keyword">voidPostAsync
  36. {
  37. ="alt">AsyncFoocaller=="keyword">AsyncFoo(Foo);
  38. caller.BeginInvoke(1000,
  39. ="alt">="keyword">AsyncCallback(FooCallBack),caller);
  40. }
  41. ="alt">
  42. ="keyword">="keyword">voidMain(="keyword">args)
  43. ="alt">{
  44. PrCurrThreadInfo(="">"Main");
  45. ="alt">="keyword">for(="keyword">i=0;i﹤10;i)
  46. {
  47. ="alt">PostAsync;
  48. }
  49. ="alt">Console.ReadLine;
  50. }
  51. ="alt">
  52. ="keyword">="keyword">voidFooCallBack(IAsyncResultar)
  53. ="alt">{
  54. PrCurrThreadInfo(="">"FooCallBack");
  55. ="alt">AsyncFoocaller=(AsyncFoo)ar.AsyncState;
  56. caller.EndInvoke(ar);
  57. ="alt">}
  58. }
  59. ="alt">}


异步和多线程区别例子代码输出如下:

    ="dp-c">
  1. ="alt">ThreadIdofMain="keyword">is:1,
  2. currentthread="keyword">isnotthreadpoolthread.
  3. ="alt">
  4. ThreadIdofFoo="keyword">is:3,
  5. ="alt">currentthread="keyword">isthreadpoolthread.
  6. ="alt">ThreadIdofFooCallBack="keyword">is:3,
  7. currentthread="keyword">isthreadpoolthread.
  8. ="alt">
  9. ThreadIdofFoo="keyword">is:3,
  10. ="alt">currentthread="keyword">isthreadpoolthread.
  11. ="alt">ThreadIdofFoo="keyword">is:4,
  12. currentthread="keyword">isthreadpoolthread.
  13. ="alt">
  14. ThreadIdofFoo="keyword">is:5,
  15. ="alt">currentthread="keyword">isthreadpoolthread.
  16. ="alt">ThreadIdofFooCallBack ="keyword">is:3,
  17. currentthread="keyword">isthreadpoolthread.
  18. ="alt">
  19. ThreadIdofFoo="keyword">is:3,


异步和多线程区别基本分析内容就向你介绍到这里希望对你了解和学习异步和多线程区别有所帮助

Tags:  同步异步区别 同步和异步的区别 同步异步的区别 wininet异步多线程

延伸阅读

最新评论

发表评论