委派 Delegate
講的簡單一點 他就像一個轉接頭
你充 iphone 需要轉接頭 但轉接頭的兩端能插什麼線是固定的
你買了 Type-C 的線 就不可能插進 Micro USB 的孔
但也就是說 只要是插的進去的線 就都可以讓你充電
今天你有錢可以用原廠的線 明天比較窮就用夜市牌的
反正只要插的進轉接器 就是可以用的線
委派 Delegate
講的簡單一點 他就像一個轉接頭
你充 iphone 需要轉接頭 但轉接頭的兩端能插什麼線是固定的
你買了 Type-C 的線 就不可能插進 Micro USB 的孔
但也就是說 只要是插的進去的線 就都可以讓你充電
今天你有錢可以用原廠的線 明天比較窮就用夜市牌的
反正只要插的進轉接器 就是可以用的線
其實所有跟 Task 有關的操作裡面,重要的事情一直只有一項
哪些會繼續往下跑、還有哪些會阻塞 (要等的意思)
今天再來看看 GetAwaiter() 的阻塞與不阻塞
前面我們看過了 Task 幾種使用方法
那如果今天我們想要的是
1. 三個好友同時搶廉航機票,只要任一人搶成功,就可以成行
=> Task.WaitAny
2. 三個好友同時從起點出發,全部都抵達終點才算獲勝
=> Task.WaitAll
3. 三個好友接力賽跑,A 跑完才能換 B,B 跑完才能換 C
=> ContinueWith
在比較久以前的.NET Framework版本 大家可能直接操作過Thread
一言以蔽之 在絕大部份情況下
建議大家使用 Task 取代 Thread
再一個問題
前面我們討論過 Parallel,當然我們也可以同時 new 很多 Task,讓結果就像是 Parallel
那我該選擇哪個?
一言以蔽之 在絕大部份情況下
建議大家用 Parallel 取代 多個 Task
Lock是一個一次只能有一個人進去的區域
但如果我有自己的上限值 ex: 一次可以 3 個人一起進入某個區域
那我該怎麼做呢?
答案就是使用 SemaphoreSlim
Parallel.For很明顯跟上一篇Parallel.Foreach是差不多的東西
所以我們再加上 Lock 來讓情況變有趣些
假設媽媽跟你說 今天晚上九點時 你有三件事要做
1. 掃地 2. 洗澡 3. 洗碗
因為這三件事並不存在先後關係 所以哪件先做都可以
而聰明如你一定會想 如果我可以同時掃地、洗澡、洗碗一起做
那不是就太好了嗎
承上題 [報表程式 - 3] 多個觸發點+多種資料來源 => ViewModel
再假設最後我們發現每個觸發點中,連組裝資料的邏輯都完全各走各的了
所以 BaseEvent 只剩下流程控制與共用類別、參數宣告的功能
除此之外都不能共用了,都會寫在各自的 Event.cs 中
上題雖然有兩個觸發點 (出站+進站) 但都來自同一張LOT_TXN 過站記錄
那假設我們今天有第三種事件 卻來自另一張表 (SNAP 快照 指的是只有每個貨批當下最新的一筆資料)
但其實三個事件間邏輯都是類似的 我們該怎麼處理呢
承上題 [報表程式 - 1] 單一觸發點
今天我們稍微把上次的例子做個變化
1. 當報進站事件 ( MoveIn ) => 數量 (Qty) 都要 +1
2. 當報出站事件時 ( MoveOut ) => 數量 (Qty) 都要 -1
但除此之外,其他欄位邏輯都相同
常常我們有一些撈報表資料的需求
我們需要從資料庫裡撈出一些符合某種情況的資料 (觸發點)
然後再根據這些資料 去衍生出更多資料 (來自更多其他的資料表)
再把所有資料拿來做一些計算
最後組裝成我們要的結果
並且以不同的方式進行呈現 (也許寫出成檔案)
NPOI是很老牌的可以讓你產出xls與xlsx的元件
但可能就是因為他太老牌了 許多操作應用上並不便利
通常程式碼中只要用了NPOI 都會看起來落落長很醜
很像.net 以前 大家寫 webform 用 datatable + gridview 在塞資料的那種味道
程式碼中 會有超多創建格子、給格式、給值.......幾百行、千行無限循環
跟現在大家喜歡寫程式習慣並不太符合
所以今天我們試著來包裝NPOI讓他變的更易用些
在C#中的複製有兩種
深度複製 (Deep Copy) 與淺層複製 (Shadow Copy)
這兩者到底是什麼意思 請大家Google一下便知道了
通常淺層複製是不需要關心的 難就難在深度複製
其實Reflection不難 但就是效能比不上hard code好
如果應用的情境不需在意效能 拿來處理一些瑣碎的小功能是蠻好用的
今天我們以假設要輸入一個字串List => 取回 不重覆、並排除空字串、Null、前後空白為例
來寫一個小function
當我們使用Entity Framework + Linq時
要做and的運算是很簡單的
目標.Where().Where().Where().....即可
但如果我們要串接Or運算呢?
很可惜Linq本身先天並不支援
但我們可以透過LinqKit的幫助
假設我們想輸出的SQL為
SELECT *
FROM [MySampleTable]
where [NAME] like '%1%' or [NAME] like '%2%' or [NAME] like '%3%'
假設我們想用Entity Framework來建構一個DAL
完整程式碼詳見 https://gitlab.com/jesperlai/Dal-Using-Entity-Framework
.Net MVC原生提供非常多種Html Helper給大家使用
其中最容易忘記怎麼用的就是DropDownList
假設我們希望看到的畫面如下
.Net MVC本身就提供一套AuthorizeAttribute
但它常常與現有系統驗證、或是資料庫內的現有帳號資料表無法整合
所以今天與大家分享怎麼實作自己的AuthorizeAttribute
functions => 函數 (在前端寫c#語法) = 你原本在後端怎麼寫c# 在前端就怎麼寫
HtmlHelper => 讓你可以在前端以C#語法生成 Html 標籤
簡單來說他就是生成一段html script
因為是程式產出的 所以可以很容易做一些動態字串的串接、跨頁面的表單元件reuse等等