這兩個主題沒什么關系,但是怕文章太短被移除主頁,
using宣告
using陳述句塊
盡管.NET Core運行時有垃圾收集器(GC)來負責記憶體清理作業,但是我們還是要自己確保當非托管資源不再使用的時候應該被清理掉,以前針對實作了IDisposable介面的物件,我們經常會使用using 陳述句塊來這樣做:
這時候它的輸出是這樣的:
這樣寫還是有一點麻煩的,能簡單一些就好了,但是而如果不使用using陳述句的話,那資源就不會被清理:
其輸出就沒有disposed那段了:
using宣告
但是從C# 8開始,我們可以使用using宣告來做這件事了,要比之前的using陳述句塊簡單一些,直接看例子:
就是在定義變數前面的地方使用using宣告,
這樣做的話,在Main方法走完的時候,db這個資源是可以被清理掉的:
可以看到db被Disposed了,但是您肯定也發現了不同之處:最后兩行輸出的順序發生了變化,
在使用using陳述句塊的時候,清理動作發生在using塊結束的時候:
而使用using宣告以后,清理動作會發生超出db作用范圍的時候,也就是離開Main方法的時候:
用法
using陳述句塊和using宣告還是要結合具體情況來使用,,,
更詳細內容請點擊:官方教程,
異步流 Asynchronous Streams
例子
這是一個很簡單的控制臺程式,它有一個NumberFactory,它可以根據傳遞的引數來產生一串數字(IEnumerable<int>),然后在這個程式中把每個數字都列印出來,同時在前邊顯示出當前的執行緒ID,
這里面的NumberFactory也是非常的簡單:
這里我做了延遲,模擬讀取外部資源的效果,
運行程式(文章考不到挨個輸出的停頓效果):
可以看到所在執行緒的ID都是1,因為其作業原理就是這樣的,程式會阻塞執行緒以便讓NumberFactory來做它的作業,所以說這樣不是很理想,最理想的辦法是使用C#的異步編程模型,但是在C# 8之前,這是做不到的,但是從C# 8開始,我們就可以這樣做了,
Asynchronous Streams 異步流
首先修改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.uj5u.com/net/112668.html
標籤:C#
