朝C#9前進

朝C#9前進

去年公司的 NAS 商城和行動網頁服務的專案翻新至 .NET Core 2.0、2.1,翻新期間 Microsofr .NET Core 3.0 和 C#8 也隨之正式發佈,這才沒過多久,緊接著 C# 9.0 的規格已經進入規劃設計的階段了!不免讓人感嘆新的技術和版本的迭代速度之快。

雖然許多細項還沒定案,我們可以在 Github dotnet csharlang 中的 Milestone 看到許多新規格及功能的提案,今天我們來介紹其中幾項 Design Review 清單中的候選功能,或許還會持續變化,但偶爾關注這些功能的策畫演變也是很有趣的。

常見引發的 Memory Leaks 情境-以 .NET 為例

Commonly triggered Memory Leaks situations take .NET as an example

先前的篇章我們簡介了 C# .NET  中的垃圾回收機制,撰寫期間剛好簡訊相關的專案也出現了 Memory Leaks Bug……儘管垃圾回收機制為我們省下許多管理記憶體的心力,然而 GC 並不是萬靈丹,仍有許多程式的撰寫漏洞會造就 Memory Leaks,與時漸進,造成記憶體耗盡之後進而 Crash 整個程式。在今天的篇章中我們將介紹幾個常見 .NET 中造成 Memory Leaks 的原因。

初窺.NET C#中的 垃圾回收機制(二)

初窺.NET C#中的 垃圾回收機制(2)

在上篇我們主要對 C# 的記憶體分區及垃圾回收機制進行簡單的介紹,在這篇中我們將介紹 Mark-Sweep 演算法如何達成清理記憶體的目標。

 

無論任何垃圾回收演算法,皆需包含兩大部分:

  1. 必須能搜尋無相關參考的物件。
  2. 必須要能對占用空間的垃圾物件進行回收的動作。

Mark and Sweep 演算法也不例外,在此演算法中,第一部分稱為 Mark Phase,遍歷所有參考物件並標記哪些仍在使用、哪些沒有;第二部分則稱為 Sweep Phase,清除在上一步驟備標記為未使用的物件,釋放記憶體空間。

C# Lock 概論

先簡單介紹一下Lock,如同大家在聽到多執行緒時常聽到的哲學家故事,今天一個圓桌上有多位哲學家,每個哲學家中間都擺著一支筷子,當個哲學家要吃飯,必須拿起哲學家左右兩邊的筷子吃飯,而其他兩旁的哲學家這時候只能負責思考,那如果兩旁的哲學家這時也想要吃飯,就會變成第一位哲學家拿起了右邊的筷子,第二位哲學家也拿起了右邊的筷子……,最後所有哲學家都拿起了一支右手的筷子,也全都在等別的筷子,而這樣就會造成死結(Deadlock),每個哲學家就像一個執行緒一樣,在互相搶資源(筷子),這時就要使用Lock,使得CPU避免正在執行的程式與其他執行中的程式互相干擾,講了這麼多我們來看看實際的範例,以下使用微軟lock 陳述式中所提供的範例做說明。

 

下方程式為模擬一個帳戶(Account)一直被扣隨機數目後,扣至零塊錢的情形。