当前位置: 首页 > news >正文

琴童少儿音乐创作网站建设/云搜索神器

琴童少儿音乐创作网站建设,云搜索神器,zb533网站建设,青海省网站建设公司电话我们会了解到异步的实质、任务的实质,以及为什么有了任务还需要一个并行类(Parallel)等问题。同时,本章内容还会告诉我们如何优雅地控制线程,并且处理任务和并行中的异常。本节为大家介绍建议71:区分异步和…

我们会了解到异步的实质、任务的实质,以及为什么有了任务还需要一个并行类(Parallel)等问题。同时,本章内容还会告诉我们如何优雅地控制线程,并且处理任务和并行中的异常。本节为大家介绍建议71:区分异步和多线程应用场景。

第6章 异步、多线程、任务和并行
在软件开发过程中,有一个领域的工作处理起来几乎总是最棘手的,这就是多线程编码。由多线程带来的传值、取值、资源同步、线程暂停、取消等操作会困扰每一个尝试编写此类代码的程序员。微软在这方面也做了巨大的努力,现在FCL中有了非常丰富的API可供选择,以便编写多线程代码。但这也带来了一个新问题:选择太多了,该选择什么样的类和方法呢?

本章将通过具体的实例,让我们熟悉异步、多线程、任务和并行。我们会了解到异步的实质、任务的实质,以及为什么有了任务还需要一个并行类(Parallel)等问题。同时,本章内容还会告诉我们如何优雅地控制线程,并且处理任务和并行中的异常。

多线程编码是所有开发人员前进途中的一个坎,现在,该是尝试克服它的时候了。

建议71:区分异步和多线程应用场景

初学者有时候会将异步和多线程混为一谈。如果对它们之间的区别不是很清楚,很容易写出下面这样的代码:

  1. private void buttonGetPage_Click(object sender, EventArgs e)
  2. {
  3. Thread t = new Thread(() =>
  4. {
  5. var request = HttpWebRequest.Create("http://www.cnblogs.com/luminji");
  6. var response = request.GetResponse();
  7. var stream = response.GetResponseStream();
  8. using (StreamReader reader = new StreamReader(stream))
  9. {
  10. var content = reader.ReadLine();
  11. textBoxPage.Text = content;
  12. }
  13. });
  14. t.Start();
  15. }

上面的代码模拟了在一个Winform窗体程序中,单击Button获取某个网页的内容并显示出来。可以预见,如果该网页的内容很多,或者当前的网络状况不太好,获取网页的过程会持续较长时间。于是,我们可能会想到用新起工作线程的方法来完成这项工作,这样在等待网页内容返回的过程中Winform界面就不会被阻滞了。

是的,上面的程序解决了界面阻滞的问题,但是,它高效吗?答案是:不。要理解这一点,需要从“IO操作的DMA(Direct Memory
Access)模式”开始讲起。DMA即直接内存访问,是一种不经过CPU而直接进行内存数据存储的数据交换模式。通过DMA的数据交换几乎可以不损耗CPU的资源。在硬件中,硬盘、网卡、声卡、显卡等都有DMA功能。CLR所提供的异步编程模型就是让我们充分利用硬件的DMA功能来释放CPU的压力。
了解这一点,再来重新审视本建议开头的这个例子。其开头部分的示例代码可以用图6-1来阐述。

图6-1 多线程工作的示意图

为了获取网页,CLR新起了一个工作线程,然后在读取网页的整个过程中,该工作线程始终被阻滞,直到获取网页完毕为止。在整个过程中,工作线程被占用着,这意味着系统的资源始终被消耗着、等待着。

如果我们修改一下代码,使用异步模式去实现,代码如下所示:

  1. private void buttonGetPage_Click(object sender, EventArgs e)
  2. {
  3. var request = HttpWebRequest.Create("http://www.sina.com.cn");
  4. request.BeginGetResponse(this.AsyncCallbackImpl, request);
  5. }
  6. public void AsyncCallbackImpl(IAsyncResult ar)
  7. {
  8. WebRequest request = ar.AsyncState as WebRequest;
  9. var response = request.EndGetResponse(ar);
  10. var stream = response.GetResponseStream();
  11. using (StreamReader reader = new StreamReader(stream))
  12. {
  13. var content = reader.ReadLine();
  14. textBoxPage.Text = content;
  15. }
  16. }

以上代码的工作机制可以用图6-2来描述

图6-2 异步工作的机制

经过修改的示例采用了异步模式,它使用线程池进行管理。新起异步操作后,CLR会将工作丢给线程池中的某个工作线程来完成。当开始I/O操作的时候,异步会将工作线程还给线程池,这时候就相当于获取网页的这个工作不会再占用任何CPU资源了。直到异步完成,即获取网页完毕,异步才会通过回调的方式通知线程池,让CLR响应异步完毕。可见,异步模式借助于线程池,极大地节约了CPU的资源。

明白了异步和多线程的区别后,我们来确定两者的应用场景:

计算密集型工作,采用多线程。

IO密集型工作,采用异步机制。

转自:http://it.anhuinews.com/762352/161940365229.shtml

转载于:https://www.cnblogs.com/bmate/archive/2012/08/17/2643674.html

http://www.lbrq.cn/news/1458073.html

相关文章:

  • dw做网站鼠标经过图像/郑州seo学校
  • 关于网站建设意见和建议/今天的新闻发布会
  • 网站建设费用细项/网站seo优化培训
  • 网站开发答辩/seo页面如何优化
  • 哪个网站是做旅游B2B的/seo的方式有哪些
  • 做网站推广工作赚钱吗/微信加精准客源软件
  • 成都海鸥手表网站/商品标题优化
  • ui设计网站模板/2345网址导航下载桌面
  • 为什么建设银行的网站打不开/关键时刻
  • 网站建设商家/新能源汽车公司
  • 济南专业网站建设/做网站需要什么条件
  • 南京市公共建设中心网站/b站新人视频怎么推广
  • 网站建设的作用有哪些方面/数据分析师资格证书怎么考
  • 怎么做地下彩票网站/长沙网络营销咨询费用
  • 网站的管理与维护/seo培训费用
  • 网站域名备案查询官网/重庆seo网站
  • 杨浦苏州网站建设/信息流广告投放工作内容
  • 做系统吧收藏的网站做没了/sem和seo
  • 网上做二建题那个网站好/市场调研分析报告怎么写
  • 与网站开发相关的书籍/江苏做网站的公司有哪些
  • 怎么对网站做seo优化/上线了建站
  • 网站建设免费代理/it培训机构排名前十
  • wordpress 采集评论/抖音seo是什么
  • 集团公司网站源码/公司seo营销
  • 做网站办公照片/汕头网页搜索排名提升
  • 做兼职哪家网站靠谱/关键词什么意思
  • 网络推广外包流程/如何利用seo赚钱
  • 做网站图标/网络营销渠道建设方案
  • 没有官方网站怎么做seo优化/在线建站模板
  • 网站模板下载器/速推网
  • 阿里云-通义灵码:解锁云原生智能开发新能力,让云开发更“灵”~
  • 电商系统想撑住大流量?ZKmall开源商城靠微服务 + Spring Boot3 解决单体架构难题
  • 迈向透明人工智能: 可解释性大语言模型研究综述
  • 09.Redis 常用命令
  • [创业之路-535]:软件需要原型验证、产品需要原型验证、商业模式也需要原型验证
  • 我的世界进阶模组教程——物品(2)