非同步雜記yield return

2022-02-16 02:01:47 字數 2039 閱讀 1957

同步的阻塞

js非同步

這個js也好!!!!

async和await的本質其實是「yield return」和「linq」的「迭代式」等待

yield return關鍵字的作用就是退出當前函式,並且會儲存當前函式執行到什麼地方,也就上下文。下次執行這個函式上次跑來的**是不會重複執行的

yield(讓出,出產,產生)

async/await本質是返回乙個task而已,而task又是非同步的(因為task本質就是乙個執行緒),

所以真正執行到(使用到async方法的時候)帶有await的方法的時候,後台才會真正開啟乙個執行緒去執行任務

此時主線程會等待這個tas**程直到其執行完畢(iscomplete屬性為true為止)。所以介面是不會卡頓的。

//新非同步,在執行await表示式都是使用ui執行緒,a

wait表示式後會啟用新的執行緒去執行非同步,直到非同步執行完成並返回結果,然後再回到ui執行緒(據說使用了synchronizationcontext)。

//所以,await是沒有阻塞ui執行緒的,也就不會造成介面的假死。==》可以理解為介面的卡頓是因為阻塞了ui執行緒,既然ui執行緒沒有阻塞,那麼介面自然不會出現卡頓的現象

debug.writeline("

【debug】主線程id:

"【debug】非同步執行緒id:

" +thread.currentthread.managedthreadid);

label1.invoke((action)(()

=>

));

= "新非同步執行完畢" + htmlstr;

//舊的非同步模式是開啟了乙個新的執行緒去執行,不會阻塞ui執行緒。這點很好理解。

var request = webrequest.create("

");request.begingetresponse(

new asynccallback(c =>));

}),

null);

private

void button1_click(object

sender, eventargs e)

private

void button2_click(object

sender, eventargs e)

debug.writeline(

"[debug]

" + sb.tostring().trim().substring(0, 100) + "

..."

); debug.writeline(

"【debug】非同步執行緒id:

" +thread.currentthread.managedthreadid);

label1.invoke((action)(() =>));

}}),

null

); debug.writeline(

"【debug】主線程id:

" +thread.currentthread.managedthreadid);

}

使用yield return實現foreach

前一篇ienumerable和ienumerator的理解 原 介紹了這兩個介面用來實現foreach 其實還可以用yield return 直接上 和結果 一下為摘錄的一部分,yield return對比前一篇 1。很簡潔。其實這裡多了乙個yield return 語句,由於yield retur...

C 中yield return用法分析

這篇文章主要介紹了c 中yield return用法,對比使用yield return與不使用yield return的流程,更直觀的分析了yield return的用法,需要的朋友可以參考下 yield關鍵字用於遍歷迴圈中,yield return用於返回ienumerable,yield bre...

C 中yield return用法分析

這篇文章主要介紹了c 中yield return用法,對比使用yield return與不使用yield return的流程,更直觀的分析了yield return的用法,需要的朋友可以參考下 yield關鍵字用於遍歷迴圈中,yield return用於返回ienumerable,yield bre...