区分异步和多线程

使用多线程获取网页内容的代码如下:

 1 using System;
 2 using System.IO;
 3 using System.Net;
 4 using System.Threading;
 5 using System.Windows.Forms;
 6
 7 namespace CS_71
 8 {
 9     public partial class Form1 : Form
10     {
11         // This delegate enables asynchronous calls for setting
12         // the text property on a TextBox control.
13         delegate void SetTextCallback(string text);
14
15         public Form1()
16         {
17             InitializeComponent();
18         }
19
20         private void btnGetPageThread_Click(object sender, EventArgs e)
21         {
22             Thread t = new Thread(new ThreadStart(() =>
23             {
24                 var request = HttpWebRequest.Create("http://www.cnblogs.com/ryukaka");
25                 var response = request.GetResponse();
26                 var stream = response.GetResponseStream();
27
28                 using (StreamReader reader = new StreamReader(stream))
29                 {
30                     var content = reader.ReadToEnd();
31                     //MessageBox.Show(content);
32                     //txtPage.Text = content;
33                     SetText(content);
34                 }
35             }));
36             t.Start();
37         }
38
39         private void SetText(string text)
40         {
41             // InvokeRequired required compares the thread ID of the
42             // calling thread to the thread ID of the creating thread.
43             // If these threads are different, it returns true.
44             if (txtPage.InvokeRequired)
45             {
46                 SetTextCallback d = new SetTextCallback(SetText);
47                 Invoke(d, new object[] { text });
48             }
49             else
50             {
51                 txtPage.Text = text;
52             }
53         }
54     }
55 }

为了获取网页,CLR新起了一个工作线程,然后在读取网页的整个过程中,该工作线程始终被阻滞,直到获取网页完毕为止。

在整个过程中工作线程被占用着,这意味着系统的资源始终被消耗着、等待着。

修改为如下异步模型:

 1 using System;
 2 using System.IO;
 3 using System.Net;
 4 using System.Threading;
 5 using System.Windows.Forms;
 6
 7 namespace CS_71
 8 {
 9     public partial class Form1 : Form
10     {
11         // This delegate enables asynchronous calls for setting
12         // the text property on a TextBox control.
13         delegate void SetTextCallback(string text);
14
15         public Form1()
16         {
17             InitializeComponent();
18         }
19
20         private void btnGetPageAsync_Click(object sender, EventArgs e)
21         {
22             var request = HttpWebRequest.Create("http://www.cnblogs.com/ryukaka");
23             request.BeginGetRequestStream(this.AsyncCallbackImpl, request);
24         }
25
26         public void AsyncCallbackImpl(IAsyncResult ar)
27         {
28             WebRequest request = ar.AsyncState as WebRequest;
29             var response = request.EndGetResponse(ar);
30             var stream = response.GetResponseStream();
31             using (StreamReader reader = new StreamReader(stream))
32             {
33                 var content = reader.ReadToEnd();
34                 txtPage.Text = content;
35             }
36         }
37     }
38 }

异步模式使用线程池进行管理。新起异步操作后,CLR会将工作丢给线程池中的某个工作线程来完成。

当I/O操作开始的时候,异步会将工作线程还给线程池,这时候就相当于获取网页的这个过程不会再占用CPU的资源了。

应用场景:

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

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

时间: 2024-10-13 00:41:00

区分异步和多线程的相关文章

【编写高质量代码C#】建议71:区分异步和多线程应用场景

1.在获取网页内容的时候,可能由于网络不好,获取时间会很长,这时候我们一般会使用新建一个线程去获取,这样在获取网页的这段时间中,主线程就不会阻滞了. private void btnGetPage_Click(object sender, EventArgs e) { Thread th = new Thread(() => { //没有下面这一行会报线程无效的异常 //设置是否捕获对错误线程的调用,调用时会访问应用程序空间的属性 Control.CheckForIllegalCrossThre

C#中异步和多线程的区别

C#中异步和多线程的区别是什么呢?异步和多线程两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性.甚至有些时候我们就认为异步和多线程是等同的概念.但是,异步和多线程还是有一些区别的.而这些区别造成了使用异步和多线程的时机的区别. 异步和多线程的区别之异步操作的本质 所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们有必要了解一下它的硬件基础. 熟悉电脑硬件的朋友肯定对DMA这个词不陌生,硬盘.光驱的技术规格中都有明确DMA的模式指标,其实网卡.声卡.显卡也是有

同步、异步、多线程与事件型综述

转自:http://blog.csdn.net/chszs/article/details/8867174 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs首先要了解什么是阻塞和阻塞式IO.线程在执行中如果遇到磁盘读写或网络通信(统称IO操作),通常要耗费较长的时间,这时操作系统会剥夺此线程的CPU控制权,使其暂停执行,同时将资源让给其他的工作线程,这种线程调度方式称为阻塞.当IO操作完毕时,操作系统将这个线程的阻塞状态解除,恢复其对CPU的控制权,令

PHP中实现异步调用多线程程序代码

本文章详细的介绍了关于PHP中实现异步调用多线程方法,下面我们以给1000个用户发送一封推荐邮件,用户输入或者导入邮件账号了提交服务器执行发送来讲述. 比如现在有一个场景,给1000个用户发送一封推荐邮件,用户输入或者导入邮件账号了提交服务器执行发送 第一种解决方法: 代码如下: <?php $count=count($emailarr); for($i=0;$i<$count;$i ) { sendmail(.....);//发送邮件 } ?>              这段代码用户体

关于异步和多线程的关系

个人的理解是这样的: 1.  异步通信的意思是,当A发送完消息之后,不等待B的回应,继续执行之后的程序.在将来的某个时刻,A再来检查是否收到B的回应. 异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作. 2. 多线程是程序设计的逻辑层概念,它是进程中并发运行的一段代码.多线程可以实现线程间的切换执行. 3. 异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待.协调运行.线程就是实现异步的一个方式.异步是让调用方法的主线程不需要同步等待另一线

并发和并行,异步与多线程区别

1.并发和并行的区别 可由上图形象指出两者的区别: 1)定义: 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行. 并行:在操作系统中,一组程序按独立异步的速度执行,无论从微观还是宏观,程序都是一起执行的. 来个比喻:并发和并行的区别就是一个人同时吃三个馒头和三个人同时吃三个馒头: 在单CPU系统中,系统调度在某一时刻只能让一个线程运行,虽然这种调试机制有多种形式(大多数是时间片轮巡为主

IOS异步和多线程操作&amp;&amp;在sqlite3中的应用

1,数据库I/O操作(异步) 数据库本身是存储在磁盘上.访问和修改数据库,即对磁盘进行读写,即I/O操作. 磁盘属于计算机硬件,具有DMA能力,不需要CPU干预,可以实现异步操作. I/O操作一般是消耗时间,sqlite使用异步处理I/O操作. 当有多个事务对数据库进行操作,对应,也会有多个I/O操作. 操作系统将I/O操作,合理放入一个I/O队列.一次性将队列内的I/O操作提交给磁盘系统,并行处理多个I/O,提高效率.本人也没有特别深入研究. 2,异步和多线程 异步和多线程,都有能力实现,不阻

程序优化方案(一) 代码优化之异步、多线程、缓存

上部分说了代码的合并,那么接下来就说说如何真正的提升程序的速度.这里不得不提到的几个优化程序速度的技术就是异步,多线程和缓存.首先我们要知道程序为什么会卡,特别是加载的时候很慢,原因在于之前的程序是单线程,中途大量的数据库操作和外部接口的调用都耗用了大量的时间导致方法堵塞,所以界面上表现的就是假死状态. 那么异步加多线程加缓存用对地方刚好可以解决这些问题,那么这三种东西都是在什么情况下使用呢. 一.异步 假如现在我们主程序上有一个Grid,当我们在加载的时候这个Grid需要绑定大量的数据,并且根

异步、多线程解惑

关于多线程和异步相信不少人都有疑问,它们之间到底有什么区别呢? 从知乎上看见一个比喻还是比较好理解的: 现在假设整个城市就只有1个火车,1个售票员,每个乘客咨询售票员后需要思考1分钟再决定买哪趟车的票. 异步 在买票的人咨询后,需要思考1分钟,马上靠边站,但不用重新排队,什么时候想清楚可以立马去跟售票员去买票.在该人站在旁边思考的时候,后面的人赶紧上去接着买.这时候队伍是很快的挪动的,没有阻塞,售票员的最大化的效率. 多线程 火车站开n个窗口(但还是只有一个人售票),外面同时排n个队,售票员回答