這兩個主題沒什麼關係,可是怕文章過短被移除主頁。html
儘管.NET Core運行時有垃圾收集器(GC)來負責內存清理工做,可是咱們仍是要本身確保當非託管資源再也不使用的時候應該被清理掉。之前針對實現了IDisposable接口的對象,咱們常常會使用using 語句塊來這樣作: 編程
這時候它的輸出是這樣的: 異步
這樣寫仍是有一點麻煩的,能簡單一些就行了。可是而若是不使用using語句的話,那資源就不會被清理: async
其輸出就沒有disposed那段了: 異步編程
可是從C# 8開始,咱們可使用using聲明來作這件事了,要比以前的using語句塊簡單一些,直接看例子: spa
就是在定義變量前面的地方使用using聲明。 線程
這樣作的話,在Main方法走完的時候,db這個資源是能夠被清理掉的: htm
能夠看到db被Disposed了,可是您確定也發現了不一樣之處:最後兩行輸出的順序發生了變化。 對象
在使用using語句塊的時候,清理動做發生在using塊結束的時候: blog
而使用using聲明之後,清理動做會發生超出db做用範圍的時候,也就是離開Main方法的時候:
using語句塊和using聲明仍是要結合具體狀況來使用。。。
更詳細內容請點擊:官方教程。
這是一個很簡單的控制檯程序。它有一個NumberFactory,它能夠根據傳遞的參數來產生一串數字(IEnumerable<int>)。而後在這個程序中把每一個數字都打印出來,同時在前邊顯示出當前的線程ID。
這裏面的NumberFactory也是很是的簡單:
這裏我作了延遲,模擬讀取外部資源的效果。
運行程序(文章考不到挨個輸出的停頓效果):
能夠看到所在線程的ID都是1。由於其工做原理就是這樣的,程序會阻塞線程以便讓NumberFactory來作它的工做。因此說這樣不是很理想,最理想的辦法是使用C#的異步編程模型,可是在C# 8以前,這是作不到的。可是從C# 8開始,咱們就能夠這樣作了。
首先修改NumberFactory,在Task.Delay(1000)前邊加上await關鍵字來代替.Wait()方法,而後再修改返回類型爲IAsyncEnumberable<int>,並在前面添加async關鍵字:
回到Main方法,須要作出兩個修改:
首先,就是在foreach循環前面加上await關鍵字,這看起來比較奇怪,但這就是咱們遍歷異步流的方式。注意是在foreach前邊加await,而不是在factory.GenerateNumbers(5)前邊加await。
而後,還須要改變Main方法的返回類型爲Task,並加上async關鍵字。
最後運行程序,看看效果:
能夠看到,線程的ID有時候會發生變化,這就是咱們想要的效果。在這裏流是異步的,當它await任務的時候,該線程是能夠去作其它工做的。而當程序繼續執行的時候,它確實可能結束於其它的線程。
更詳細內容請點擊:官方教程。
原文出處:https://www.cnblogs.com/cgzl/p/11773102.html