异步杂记
同步的阻塞? JS異步? 這個JS也好!!!!
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);
}
轉載于:https://www.cnblogs.com/ZkbFighting/p/7601987.html
總結
- 上一篇: c++ winpcap开发(9)
- 下一篇: 第八章 界面外观