Yield Return - 本質
🐛 yield return 的核心本質將「一次性完成」的方法,轉換成「逐步產生序列」的狀態機。
傳統方法:輸入 → 計算 → 輸出結果,一次性結束。使用 yield return 方法可以 暫停、保存狀態、按需產生值,直到所有結果都產生完畢。
控制流的「暫停與恢復」使用 yield return,方法不再是從頭到尾一次性執行完畢,而是允許執行到某個點時「暫停」,並記住執行上下文(局部變量、當前位置等),等待下一次繼續執行。
一般方法
123456int[] GenerateNumbers(){ return new int[] { 1, 2, 3 };}
使用 yield return
12345678IEnumerable<int> GenerateNumbers(){ yield return 1; yield return 2; yield return 3;}
執行過程像這樣:
第一次 MoveNext() → 跑到 yield return 1,暫停,回傳 1第二次 M ...
Yield Return - 實驗
🐛 IEnumerable + yield 的運作機制詳解
一般集合的回傳方式123456789101112131415161718192021222324252627282930313233void Main(){ var store = new DemoStore(); var productList = store.GetProducts(); foreach (var product in productList) { $"{product.Id},{product.Name}".Dump(); }}public class DemoStore{ public List<Product> GetProducts() { List<Product> result = new List<Product>(); for (int i = 0; ...
Asynchronous Programming - 第六章:時間碎片裡的員工們-2
共享資源沒有被妥善同步處理Race Condition(競態條件)Deadlock(死鎖)Starvation(飢餓)Priority Inversion(優先級反轉)Multi-threading 做法Multi-processingAPI Web ServerChrome 使用 Multi-Process 架構IDE共享資源是什麼?
一筆資料(例如某筆訂單、座位狀態)
一段記憶體(像共用的快取陣列)
一個硬體裝置(例如印表機、檔案寫入)
一個全域變數或物件
甚至是「系統的鎖資源本身」
當系統有了多個 Thread,一切看似井然有序、效率飛快,但只要一不小心,就會變成一場混亂的現場。這些混亂,我們統稱為同步問題(Synchronization Problems)。這些問題源自一個核心事實,多個執行緒試圖同時存取同一份共享資源,卻沒有適當協調。結果就像幾個員工搶著用一台影印機,可能導致不是印出錯內容、就是永遠卡在佇列。
同步問題常見的四大類型如下,我們以訂票系統來說明
執行緒 1 和執行緒 2 同時查詢「座位 A1 是否可訂」,兩者皆發現「尚未被預訂」,於是幾乎同時發出訂位請求。 ...
Asynchronous Programming - 第六章:時間碎片裡的員工們
huanlintalk莫力全 Kyle MoProgram,Process,Thread青耀隨筆談
Program、Process、Thread當世界還只能一條路餐廳開多間了,但廚師還是只有一個員工來了—— Thread 的誕生換人上場的代價:執行緒的切換成本CPU 的角色輪替當 Thread 遇上外來者:非託管 DLL 的插手summary想像你是一位準備開店的廚師,桌上攤開一本厚重的菜譜,這就是你的 Program(程式碼集合)。它記錄了每道菜的做法、調味的比例、上菜的順序……但這些指示仍停留在紙上,尚未進入現實。它像是還未走進世界的夢,只存在於設計之中。
當你真正開張營業、招呼客人,這份菜譜就被實體化成了一間 Process(處理程序)一間運作中的餐廳。這間餐廳開始佔據空間(記憶體)、使用瓦斯爐(CPU)、冰箱(硬碟),並啟動了你的夢想。每一間正在運作的餐廳,都是一個獨立的 Process,就像你電腦上同時開著 Word、Chrome 和 Spotify,一家店煮咖哩、一家店沖咖啡,彼此不會互相干擾。。
但餐廳開起來只是第一步,真正讓整個流程流動的,是餐廳裡的「人」—— 這些人 ...
.NET CORE 環境變數
將 APIKey 存進環境變數參考 : https://blog.darkthread.net/blog/secure-apikey-for-console-app/
1234567891011121314151617181920212223242526byte[] additionalEntropy = { 9, 8, 7, 6, 5 };Func<string, string> GetSecureEnvVar = (varName) => { var val = Environment.GetEnvironmentVariable(varName, EnvironmentVariableTarget.User); if (!string.IsNullOrEmpty(val)) { try { val = Encoding.UTF8.GetString( ProtectedData.Unprotect(Convert.F ...
Asynchronous Programming - 第五章:錯誤等待的死鎖之吻
love為什麼 .Result 有時會讓整個程式卡住ASP.NET Core 不再死鎖如果我用 await 而不是 .Resultsummary
他們曾經相愛,也曾經深信,只要彼此都願意等,愛就會回來
她把訊息輸入對話框,卻沒有按下傳送,想等他主動說第一句話。她想:「他如果真的在乎,就會找我。」他打開視窗看了又看,也沒傳訊息,心想:「她如果還有感覺,就會先聯絡我。」
它們每天打開彼此的聊天室又關上,不是沒有思念,而是不願先伸出手。怕輸、怕低頭、怕被拒絕,在各自的世界靜靜地等,畫了一個誰也跨不過的等待邊界,兩個 .Result() 卡在彼此門前,沒有人願意給對方 await 的空間
async deadlock
await 與 Task.Result/Task.Wait () 的 Deadlock 問題
在 ASP.NET 舊版框架中,若在同步方法中呼叫非同步方法
1var result = GetDataAsync().Result;
可能會遇到一個非常棘手的問題:Deadlock
事情是這樣發生的
主執行緒呼叫 .Result,進入「同步等待」狀態,卡住不動
GetDa ...
Asynchronous Programming - 第四章:彼岸未歸的異步任務
textMessage在同步環境中強行等待非同步 Task 完成實驗篇結果分析summary
她在深夜寫了一段訊息,對著那個熟悉的對話框,輕輕按下「傳送」
網路似乎是卡住了,畫面顯示「正在傳送…」,她關上了手機,心想:「應該已經送出了吧。」
隔天,她等不到回應。那人說沒收到。
她打開訊息記錄,那串話仍顯示為「未送達」,就像訊息從未存在過
一個沒有被接收的訊息,不會自動變成世界的理解;一個沒有被等待的結果,也無法保證會如你所想地完成
在實務開發中,我們經常面臨一種情境:必須等待某個非同步任務完成,才能繼續執行接下來的邏輯。但如果我們當下的環境是同步方法(例如 Main() 或某些事件處理函式),該怎麼辦?
這時,許多開發者會選擇以下方式強行「同步化」等待
.Wait()
.Result
GetAwaiter().GetResult()
它們都會強迫等待 Task 結束,但錯誤處理機制卻有天壤之別,而這個差異,正是許多初學者第一次遇到的陷阱。以下,我們將模仿實驗,實際觀察其錯誤行為與影響,像是 .Wait() 和 .Result 不是把錯誤丟給你,而是「包一層再丟」,讓你更難看清真相 ...
CloudFront
CloudFront 就是 AWS 在全球各地設置了許多 Server,稱為 edge locations,這些 Server 可能存了網站的副本內容(如圖片、影片、網頁…等)。當使用者訪問網站時,他們會從最近的邊緣位置獲取內容,台灣雖然不是 AZ (Availability Zones) 但也設有 edge location!
幾個重要的名詞解釋Origin:
所有的原始文件(如圖片、影片、網頁等)都存放在這裡可以是 Amazon S3 存儲桶、EC2 伺服器,或者是由多台 EC2 伺服器組成的負載均衡系統
Edge Server:
這些就像是分布在世界各地的小型倉庫它們儲存源站內容的副本當用戶請求內容時,如果 Edge Server 有該內容,就直接提供如果沒有,就會向 Origin 請求,然後儲存並提供給用戶
Distribution:
這是 CDN 服務的入口點。就像是一個智能導航系統。當用戶訪問網站時,這個系統會自動將他們引導到最近的 Edge Server
Web Distribution:
這是專門為網站設計的分發類型。處理常見的網站文件,如圖片、CSS、JavaSc ...
Stripe (串接 ApplyPay 所需要知道的事)
最近在串接 Stripe 的 ApplePay,花了一段時間理解 Stripe 的付款流程,這邊整理一下 ApplePay Server side 這邊要知道的一些事情備忘
名詞解釋Platform Account : 平台帳戶,底下可能會有多個子帳戶Connected Account : 底下的子帳戶,就是你管理的商戶們
Direct Charge : Platform Account 與 Connected Account 是以 Standard 模式關聯在一起,客戶付款時,錢會直接流向 Connected Account,通常若商店選擇這種方式表示他們有能力處理與 Stripe 談到較好費率的能力,不需要電商平台處理
Destination Charge :
Direct charge 概念:
Direct chargen 所指的方面是在 Stripe Connect 平台中,最終用戶(客戶)直接與商家(關聯帳戶)進行交易的模式。
客戶感知:在這種模式下,客戶可能不知道有一個中間平台參與其中。他們認為自己是直接與商家交易。
收費歸屬:交易記錄會出現在商家的 Stripe 帳 ...
Content Delivery Network(CDN)
在勤美綠園道上🍮 用布丁理解 CDN:就近提供內容👾 技術面看 CDN Cache 怎麼運作?CloudFront Distribution用 S3 + CloudFront 建立 CDN 快取CDN 的本質是什麼?適合的情境🔹頻寬🔹攻擊防範(DoS / DDoS)🤔 我的網站有需要使用 CDN 嗎?Serverless CDN 與邊緣計算(Edge Computing)在一個大熱天的午後,你走在勤美綠園道上,突然想吃點冰冰涼涼的甜點。你走了 3 分鐘,到附近的全家便利商店,打開冰櫃看到一盒寫著「東京限定布丁」的商品,決定嚐嚐這份來自職人之國的綿密滋味
等等 為什麼我在台中,卻能在便利商店買到「東京限定」的布丁?
如果是從日本工廠直寄過來,理論上要等上好幾天、還可能被海關卡住。但今天我們能即時吃到,是因為「全家便利商店」早就跟日本合作,把布丁大量送到全台分店的冷藏庫裡,你走路 3 分鐘就能買到!CDN 預先把內容(如圖片、影片、靜態網頁)複製到遍佈世界各地的節點,當使用者要存取網站時,就能從最近的節點取得資料,而不用跨越半個地球回到原始主機
📦 布丁=靜態資源🏪 ...














