Asynchronous Programming - 第十二章:章魚的八爪例外:多執行緒的捕獲術
章魚實驗一:沒 await,什麼都接不到實驗二:用 .Result 或 .Wait() 阻塞取得結果實驗三:使用 await 等待結果實驗四:Task 不回傳值也一樣多個 Task 的例外處理✅ 最佳實踐在深海裡,章魚的八隻腕足總是同時探向不同的方向,纏繞著礁岩、觸碰著漩渦,也悄悄在黑暗中編織出一張未被看見的網。我們的非同步程式,就像這隻章魚,當你派出無數任務游向未知,若沒有好好等待(await),有些錯誤就會像溜走的墨汁般散開,再也無法追溯
若選擇用同步阻塞強行捕捉,例外也會被包裹成難解的聚合結,像是八爪同時纏住獵物卻黏成一團。學會如何等待,如何攤開多執行緒裡潛藏的觸手,才是馴服這隻章魚、看清每一道潛伏例外的唯一方法。
🐙12345678910111213141516public static async Task ExceptionResultTest(){ try { TaskThatThrowsExceptionStringAsync(); } catch(Exception ex) { ...
Asynchronous Programming - 第十一章:未繭之絲:任務才是本體
使用 .NET Async/Await 的常見錯誤正確理解 C# async 與非同步
蠶的軀殼非同步的本質:回傳 Task 才是真的非同步什麼時候可以不加 await?什麼時候一定要?狀態機的工作:記得「下一步要去哪裡」summary在多執行緒的森林裡,有些線,早已抽離了蠶的軀殼,它們不需繭的庇護,也能沿著記憶結點游走。我們誤以為是 await 編織了非同步的絲線,卻忘了真正編織的是那些未繭的任務。只要 Task 尚在,無論繭在與否,線都還在地底延展,繼續牽動著下一個狀態機的呼吸
非同步的核心是 Task 或 Task<T> 型別。只要方法回傳 Task,它就是非同步,因為 Task 代表著「進行中的工作」。是否使用 await 不影響方法本身是否非同步,await 只決定要不要在這裡把結果拿回來、接著做後續的邏輯。await 的本質是「把非同步操作的結果,用同步的方式 等待完成後,接著執行後續的程式碼」。
沒用 await123public Task<int> GetDataAsync() { return GetDataFro ...
Asynchronous Programming - 第十章:未完成的回聲
簡介.NET 4.0 的多工執行利器 –Task
C# 學習筆記:多執行緒 (6) - TPL
派遣出去的夜簡單的建立一個 Task那要怎麼「等他」?等待兩個任務等待結果回傳再繼續跑實驗:觀察 Task 的執行狀態結果與分析summary在每一個任務被派遣出去的夜裡,總有一些聲音,無法即刻歸來。它們在平行的執行緒裡交錯穿行,有的抵達了終點,返回一聲輕快的完成;有的在等待中腐蝕,成為無聲的阻塞;有的半途拋下誓言,消失在取消的荒野裡。你以為程式碼寫好了,流向已然明朗,卻不知每個 Task 都像流浪的信件,封存著可能,也埋藏著未竟
TPL,不只是一套平行的工具,它是一場關於 等待與命運 的實驗,每一個 WaitAll、WhenAny、Result,都是開啟分支與結局的咒語。當結果未歸,回聲仍在。在執行緒的深處,有些任務,終將完成;有些回聲,永遠未完先用最簡單的 Task.Run 建立一個任務,看看它跟一般程式碼的執行順序有什麼不一樣。
1234567891011121314151617static void Main(string[] args){ SimpleTask() ...
Asynchronous Programming - 第九章:平行之風,併發之歌
穿梭林間實驗 : Single Thread / Parallel.For / Task-based測試紀錄Single ThreadParallel.ForTask-based (Concurrency)summary有些風,獨自穿梭林間,沿著樹影與地面爬行,沒有分身,沒有回音,只將時間吹得靜謐有些風,輕輕裂成數萬縷絲線,從山脊滲入溪谷,從枝頭滲入土壤,它們彼此不糾纏,卻同時為大地帶來不同的聲響
也有些種子,懂得在雲後潛伏,等待雨季將它們喚醒;一顆未必只能開一朵花,它可以把等待切碎,併發成無數顆更小的種子,在時間的縫隙裡生根發芽
當我們談論分割與合流,等待與釋放,這片風與影子的地圖,就是平行之風,併發之歌那些藏在核心深處的秘密,終究會在一次又一次的呼吸裡,被我們拆解、重組、散播,直到有一天,學會怎樣用一秒去換取另一秒
用.NET展現多核威力(1) - 從ThreadPool翻船談起
這個實驗透過一個簡單的數學運算(Math.Log10),使用
單執行緒(Single Thread)平行迴圈(Parallel.For)Task-based 併發(async/await + Task. ...
Casting
Stone StoryImplicit CastingExplicit CastingUpcastingDowncastingBoxing (裝箱) 與 Unboxing (拆箱) - 比較舊的快取系統Boxing (裝箱) 與 Unboxing (拆箱) - 快取或屬性容器結語有一塊碎石,曾在河岸邊靜靜沉睡百年。它堅硬、粗糙、不懂流動。直到有一天,一條溪水與它擦身而過。
「你怎麼總是不動?」水問
「我就是這樣被造的,不像你,總能輕盈地轉彎、改道。」碎石低聲說
「但你知道嗎?」水輕聲笑道,「我之所以能走那麼遠,是因為我願意轉。」
碎石覺得,那句話如同一道光,悄悄劃過它堅硬的內裡。它開始想:如果有一天,我也能在某個時刻學會轉型 —— 也許,我也能成為某種形式的流動看看這個世界更多的樣貌。
在程式的語法中,我們見證數字從一種型態變成另一種形態、物件從一個面貌蛻變為更適配的角色。這些「轉型」,看似只是語法上的操作,實則承載著如何讓資料 順勢而生、應需而變 的深意。
而我們,是否也能從中學會,如何在對的時機,捨去執念、跨越邊界?如何在堅固與柔軟之間,找到最合宜的模樣?
一個電子商務網站的購物車 ...
EF Core - NotSupportedException
NotSupportedException:
描述: 當試圖使用資料庫不支援的功能時引發,或者當特定操作不適用於當前操作的提供者時引發。
例子: 嘗試使用某些特定於 SQL Server 或 SQLite 的功能,但資料庫供應者不支援這些功能。
https://hackmd.io/@CloudyWing/ryWlBCwcA
EF Core - TimeoutException
TimeoutException:
描述: 當嘗試與資料庫進行交互時,操作超時未能完成時引發。
例子: 執行一個複雜的查詢或更新操作,但是在預定的時間內未能完成。
EF Core - InvalidOperationException
程式世界裡最令人頭痛的,從來不是錯誤訊息,而是「有時錯,有時對」的那種模糊不明。你是不是也曾遇過:明明昨天的程式還好好的,今天一跑卻爆了 InvalidOperationException?
這不是你寫錯,而是你不小心跨越了 DbContext 的界線。就像在海上行船,一不小心就漂出了領海,進入無人知曉的風暴。
這篇文章將帶你從根源理解 InvalidOperationException 的幾個常見場景,並透過範例與圖解,一次性釐清觀念,避免未來再被神祕的錯誤訊息追殺。
💥 DbContext 實例重複使用|一艘船不能載兩個船長問題來源當你在多個請求或執行緒間重複使用同一個 DbContext 實例,就可能觸發 InvalidOperationException。為什麼?因為…
❗ DbContext 不是 Thread-Safe 的物件。
它內部維護著實體狀態(Added, Modified, Deleted…),而這些狀態並不是為多執行緒設計的。你讓多個線程同時操控 DbContext,就像讓兩個船長同時掌舵 —— 翻船。
12345678910public class ...
EF Core - DbUpdateConcurrencyException
Google 文件Concurrency(並行)DbUpdateConcurrencyExceptionRowVersion:守門的指紋那發生例外時該怎麼辦?summary想像你和同事一起編輯一份 Google 文件,你正專心致志地輸入「我們應該大力加薪」,正當你按下儲存,結果——對方也在同一秒按下儲存,而他打的是:「大家應該自願減薪來展現團隊精神。」
🙃 到底誰的才算?你打的血汗心聲,還是對方的職場邪教宣言?1這,就是所謂的 並行更新(Concurrency)問題。而 EF Core 的 DbUpdateConcurrencyException 就是在提醒你:「欸欸欸,有人先改過這筆資料囉!」
Concurrency 指的是「多個流程同時存取並可能修改同一筆資料」的情況,這在多人協作系統中非常常見,例如:
多位使用者同時編輯同一筆訂單或資料。
他們都按下儲存。
如果系統沒有檢查誰先誰後,那麼後儲存的人將會直接覆蓋掉前面的變更。
這會帶來許多潛在問題:
✅ 使用者的更新被悄悄蓋掉,卻毫無察覺
✅ 系統記錄出現矛盾,無法追蹤真實修改者
✅ 使用者困惑:「剛剛不是明明有改成 ...
EF Core - DbUpdateException
hidden reef主鍵(Primary Key)衝突,一碼歸一人外鍵(Foreign Key)違反,找不到對應人必填欄位(NOT NULL)為 null : 不該留白的愛欄位長度限制超過(MaxLength/Size) : 你話太多了資料類型不相符 : 能飛不代表能跑違反唯一約束(Unique Constraint) : 這世界只容一個你summary你是否曾在 SaveChanges() 時迎來晴天霹靂,一行紅字 DbUpdateException 打斷了你的程式?這就像在大海航行時,突然撞上一座看不見的暗礁──平時無聲無息,一出事卻攪得你天翻地覆。這篇文章,我們就來一起潛入這片資料海域,探查六種常見導致 DbUpdateException 的暗礁地形。每一種都有它的風險與成因,但只要理解清楚,就能順利避開,繼續駛向資料的彼岸。
主鍵(Primary Key)是資料的身份證號。若你試圖插入一筆資料,但主鍵與資料庫中已存在的資料相同,那就如同系統收到兩張一模一樣的身分證,無法分辨誰是誰,只能報錯。
12context.Users.Add(new User { Id = ...








