码迷,mamicode.com
首页 > 其他好文 > 详细

异步杂记

时间:2017-09-27 16:09:18      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:异步   invoke   call   complete   info   using   write   htm   amr   

async和await的本质其实是“yield return”和“LINQ”的“迭代式”等待

async/await本质是返回一个Task而已,而Task又是异步的(因为Task本质就是一个线程),所以真正执行到(使用到async方法的时候)带有await的方法的时候,后台才会真正开启一个线程去执行任务。此时主线程会等待这个Task线程直到其执行完毕(IsComplete属性为True为止)。所以界面是不会卡顿的。

=========================================================

//新异步,在执行await表达式前都是使用UI线程,await表达式后会启用新的线程去执行异步,直到异步执行完成并返回结果,然后再回到UI线程(据说使用了SynchronizationContext)。
//所以,await是没有阻塞UI线程的,也就不会造成界面的假死。
Debug.WriteLine("【Debug】主线程ID:" + Thread.CurrentThread.ManagedThreadId);
//System.Net.Http
HttpClient http = new HttpClient();
var htmlstr = await http.GetStreamAsync("http://www.jb51.net/article/57156.htm");
StreamReader sr = new StreamReader(htmlstr,Encoding.UTF8);
var str = sr.ReadToEnd();
Debug.WriteLine("【Debug】异步线程ID:" + Thread.CurrentThread.ManagedThreadId);
label1.Invoke((Action)(() => { label1.Text = "新异步执行完成" + str; }));
// label1.Text = "新异步执行完毕" + htmlstr;

===========================================================

//旧的异步模式是开启了一个新的线程去执行,不会阻塞UI线程。这点很好理解。
var request = WebRequest.Create("http://www.jb51.net/article/57156.htm");
request.BeginGetResponse(new AsyncCallback(c => {//BeginGetResponse 对网络资源进行异步操作,
//如果要读取网络资源,用流的形式来展示,
StreamReader sd = new StreamReader(request.GetResponse().GetResponseStream());
var str = sd.ReadToEnd();
label1.Invoke((Action)(() => { label1.Text = "旧异步执行完成"+str; }));
}),null);

==============================================================

private void button1_Click(object sender, EventArgs e)
{
//因为winform始终都需要UI线程渲染界面,如果被UI线程占用则会出现“假死”状态
Debug.WriteLine("[Debug]线程ID"+Thread.CurrentThread.ManagedThreadId);
var request = WebRequest.Create("https://github.com/");
request.GetResponse();//发送请求
Debug.WriteLine("[Debug]线程ID" + Thread.CurrentThread.ManagedThreadId);
label1.Text = "执行完毕";
//方法调用前和调用后线程ID都是9(也就是同一个线程)
}

======= ===== ====== ===== === == = = == = = = = = = = = 

private void button2_Click(object sender, EventArgs e)
{
//APM异步编程,Asynchronous Programming Model
//C#1 基于IAsynchronous 接口实现Beginxxxx 和EndXXX
Debug.WriteLine("[Debug]线程ID" + Thread.CurrentThread.ManagedThreadId);
//HttpWebRequest类主要利用HTTP 协议和服务器交互
//Create 里的参数是要访问的网址,一般会返回给你个信息,一般会返回XML或者json
var request = WebRequest.Create("http://www.cnblogs.com/haogj/archive/2011/06/09/2076708.html");
Debug.WriteLine(request);
request.BeginGetResponse(new AsyncCallback(t =>//执行完成后的回掉
{
var response = request.EndGetResponse(t);
var stream = response.GetResponseStream();
using(StreamReader reader=new StreamReader(stream))
{
StringBuilder sb = new StringBuilder();
while(!reader.EndOfStream)
{
var content = reader.ReadLine();
sb.Append(content);
}
Debug.WriteLine("[Debug]"+sb.ToString().Trim().Substring(0,100)+"...");
Debug.WriteLine("【Debug】异步线程ID:" + Thread.CurrentThread.ManagedThreadId);
label1.Invoke((Action)(() => { label1.Text = sb.ToString(); }));
}

}),null);
Debug.WriteLine("【Debug】主线程ID:" + Thread.CurrentThread.ManagedThreadId);

}

异步杂记

标签:异步   invoke   call   complete   info   using   write   htm   amr   

原文地址:http://www.cnblogs.com/ZkbFighting/p/7601987.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!