顯示具有 Task 標籤的文章。 顯示所有文章
顯示具有 Task 標籤的文章。 顯示所有文章

2022年7月23日 星期六

Vulcan Lee 在 .NET / C# 開發環境下提供的教育訓練教學課程

Vulcan Lee 在 .NET / C# 開發環境下提供的教育訓練教學課程

從 2012 年開始進行 .NET / C# 教育訓練課程之後,對於許多開發出來的課程,並不是隨便敷衍的設計出來,這其中我會不斷地針對已經開發出來的課程來進行修正、改版、追加內容,因此,相關的課程是不斷的在變化與強化的。

要完成這樣的一系列課程是一種自我挑戰,讓自己可以看得更高、看得更遠、讓抄襲者永遠無法模仿,因為,這些課程加入了許多巧思與技能在裡面,內行看門道、外行看熱鬧。

我所設計的教學課程,為了要能夠讓入門者、想要精通者都可以喜歡我設計的課程,將會把課程應該具有的特色,所提供的內容將會涵蓋到更多的層面、更多範例碼、更多觀念介紹、更多的動畫來理解艱澀技術應用、更多挑戰應用、更多的日常遇到問題與解決方法、更完整的開發設計指引。

因此,很期望到時候能夠與大家一起來進行這個課程的交流與互動,也希望大家可以從這些課程學到更多知識與經驗,應用在日常開發專案上。

若對於這些課程有興趣,或者想要企業內訊者,可以在此留言,或者到 Xamarin Blazor 實驗室 粉絲團來私訊給我

初探 .NET 平行程式設計 (非同步程式設計系列 之 1 / 6)

這年頭手機都多核心了我們寫的程式還跑在單核上嗎?

一台電腦8核16緒但我們的程式就是跑不快?

平行程式設計是近年來一個很務實的議題,之前 SkillTree 有開過較進階的「勇闖非同步程式設計」,收到許多開發人員的好評但有開發人員反應希望能夠開設更初階一點的入門主題,於是本活動來了!這是專門為了「沒實際摸過平行運算、非同步的開發人員」所設計的,讓你短時間掌握平行程式設計基本概念與觀念。

課程大綱

  • 使用同步程式設計來解決問題
  • 了解同步程式設計的瓶頸與使用非同步程式設計要解決的問題
  • 為什麼要有平行程式設計與微軟提出的解決方案
  • 將待解決問題採用平行、並行非同步程式設計 - 使用 執行緒 與 執行緒集區
  • 了解平行與並行計算的不同
  • 介紹什麼是非同步程式設計
  • 使用 TPL Task Parallel Library 工作平行類別庫 來解決問題
  • 使用 Timer,Background,委派來進行非同步程式設計
  • 使用資料平行處理程式設計來解決問題
  • 使用 PLINQ 來解決問題

等級

入門

需求

  • 具備 C# 程式語言開發經驗
  • 具有 委派 Delegate 的知識與使用技術

想要參加

此課程為 Skill Tree 專屬課程,想要參加者,請隨時注意 Skill Tree 的最新公告

參考網址 : https://skilltree.my/Events/2022/1/9/Parallel-programming-in-dotnet-for-beginners-Batch-2

由 Parallel.For 來看多執行緒程式設計 (非同步程式設計系列 之 2 / 6)

在多執行緒程式設計領域中,有 TPL , ThreadPool , Parallel.For , PLINQ 等等技術,其目的在降低使用複雜度,提供高階程式設計模型,開發者可以很容易地使用這些功能。但坊間流竄許多種各式各樣的奇技淫巧,有些是聽從前輩的建議,有些是自身特定情境中的經驗,這些招式與看法不能說錯,但總是片片斷斷無法有系統的理解背後的原理與限制,所以 SkillTree 舉辦了本活動針對 Parallel.For 做深入的探討,藉由因循漸進的案例讓您充分了解這技術的奧妙。

本課程是平行程式設計的初階,不是程式學習的初階,您必須具備 C# 開發經驗、了解泛型與委派的使用方式,並且具備基本電腦架構運作知識。

本課程的緣由來自臉書討論版上的一連長串討論內容,有興趣的人可以查看 討論串列 螢幕截圖,若你對於這片串列上所提出的問題,或者有人提出的解答,存在著疑問或者更多的問題,那麼,你一定要來報名參加這個課程,因為,你所有的問題都可以從這個課程中獲得解答。

課程大綱

  • Paraller.For 效能驗證
  • Paraller.For 與 Thread 兩者的差異與極限
  • Paraller.For 與 Task(TPL) 相互的優缺點評比
  • Task 實踐與原理探討

等級

入門

需求

  • 具備 C# 程式語言開發經驗
  • 具有 委派 Delegate 的知識與使用技術

想要參加

此課程為 Skill Tree 專屬課程,想要參加者,請隨時注意 Skill Tree 的最新公告

參考網址 : https://skilltree.my/Events/2022/1/16/NET-CSharp-Parallel-Programming-Batch-2

精準解析 .NET Thread 執行緒 (非同步程式設計系列 之 3 / 6)

在 .NET 要建立一個執行緒,將需要指定一個委派方法,而一個執行緒 Thread 代表一個正在同步執行程式碼,若想要同時執行多個委派方法,則需要建立多個執行緒,而一台電腦能夠同時處理執行緒的數量,將會取決於這台電腦上的 CPU 的能力。

身為一個 .NET / C# 程式設計師,想要提升自我能力,使其可以進行平行程式設計技能,就需要具備多執行緒開發技術。透過多執行緒設計出來的程式碼,將可以同時執行多個程式碼,並會有助於整體應用程式的執行效能提升,充分發揮這台電腦 CPU 的執行效能。

然而,如何進行多執行緒的程式設計,將會需要學習 .NET 中的 Thread 物件的使用與操作,當完成此課程之後,你將會具有多執行緒程式設計的能力,並且了解到多執行緒程式設計上會遇到的問題與瓶頸。

課程大綱

  • 執行緒    Thread - 基本認識
  • 產生     Creation
  • 啟動     Start
  • 傳入參數   Parameter
  • 結束     Wait / Join
  • 傳回值    Return Value
  • 優先權    Priority
  • 前景與背景  Foreground / Background
  • 取消     Cancellation
  • 異常與除錯  Exception

等級

中階

需求

  • 具備 C# 程式語言開發經驗
  • 具有 委派 Delegate 的知識與使用技術
  • 了解 平行、並行、同步、非同步等知識

想要參加

此課程為 Skill Tree 專屬課程,想要參加者,請隨時注意 Skill Tree 的最新公告

參考網址 : https://skilltree.my/Events/2022/7/17/analyzing-dot-net-thread

精準解析 .NET Task 工作 (非同步程式設計系列 之 4 / 6)

以往想要進行平行或非同步程式設計(平行計算是一種非同步計算,前者屬於透過 CPU 來做到同時執行的需求,後者大多表示要進行 I/O 或者網路呼叫的時候,所要進行的處理作業),往往需要透過多執行緒來完成,可是要能夠充分駕馭執行緒來完成上述設計需求,對於絕大多數的程式設計師而言,將不是一件簡單的工作;有鑑於此,微軟在 .NET Framework 4.0 之後,推出了 工作平行類別庫 Task Parallel Library (TPL),而在 .NET BCL 中的許多 API,也都改寫成為使用了 TAP 以工作為基礎的非同步模式 Task-based Asynchronous Pattern 的 API,取代以往 APM 與 EAP 的程式設計做法;這樣的改變將會讓 C# 程式設計師可以享受到許多 TPL 類別庫所帶來好處。

使用 TPL 中來執行的工作 Task 物件,通常是從執行緒集區上取得執行緒來以非同步方式進行執行,透過將複雜的執行緒操作封裝到工作物件內,讓程式設計師可以更加輕鬆與容易地來進平行與非同步的需求設計。

當完成此活動之後,你將會具備使用 Task 物件來進行非同步程式設計能力,讓設計出來的應用程式專案不在執行時候發生卡卡現象,充分享受到非同步程式設計所帶來的好處,當然,對於日後要精通 C# 5.0 所提供的 async 與 await 技術,將是不可或缺與必備的知識。

課程大綱

  • 什麼是「工作」(Task)
  • Thread 與 Task 的異同說明
  • Task 的使用情境
    • 產生
    • 啟動或傳入參數
    • 等候結束或傳回值
    • 繼續
    • 狀態
    • 取消
    • 進度
    • 異常與除錯

等級

中階

需求

  • 具備 C# 程式語言開發經驗
  • 具有 委派 Delegate 的知識與使用技術
  • 了解 平行、並行、同步、非同步等知識

想要參加

此課程為 Skill Tree 專屬課程,想要參加者,請隨時注意 Skill Tree 的最新公告

參考網址 : https://skilltree.my/Events/2022/7/10/analyzing-dot-net-task

精通與使用 async 與 await (非同步程式設計系列 之 5 / 6)

在以往想要在 .NET / C# 下進行非同步程式設計的時候,可以套用不同設計模式來做到,這包括了 : Asynchronous Programming Model (APM) / Event-based Asynchronous Pattern (EAP) / Task-based Asynchronous Pattern (TAP);然而這些設計模式還是存有潛在許多問題無法解決,使用起來總是卡卡不順。

當 .NET Framework 4.5 與 C# 5.0 推出之後,對於 .NET 開發者而言,日後面對於非同步程式設計需求變得更加簡單雨容易,而且也方便除錯與開發,這些神奇的事情將會來自於可以透過 async 關鍵字將同步方法轉換為非同步方法,如此,在此非同步方法內便允許使用 await 關鍵字。 一旦使用 await 關鍵字要進行非同步作業呼叫的時候,將不會造成當前執行緒被封鎖直到非同步作業結束,而是立即歸還當前執行緒,這樣的設計方式大幅提升整體系統的運作效能與 UI 流暢回應能力。

在本課程中,將會介紹使用 async 修飾符和 await 關鍵字,如何在 C# 中進行非同步程式設計的作法。 這個課程將會提供相關 async await 的相關知識與觀念,透過不同範例程式碼來理解使用與應用技巧,透過動畫來理解艱澀難懂的技術與知識應用、學會更多日常遇到問題與解決方法、與完整的開發設計指引與口訣。

課程大綱

  • 初次探索 async await 運作方式
  • 編譯器對 async 做了哪些事情
  • 了解非同步工作、方法差異
  • async await 的開發指引與設計口訣
  • 洞悉與活用 async await
  • 更多 await 的相關問題

等級

高階

需求

不建議對於 .NET C# 非同步程式設計沒有經驗人參加此課程

  • 具備 C# 程式語言開發經驗
  • 具有 委派 Delegate 的知識與使用技術
  • 了解 平行、並行、同步、非同步等知識
  • 具有 Thread 執行緒類別使用與程式設計經驗
  • 具有使用 TPL Task 工作類別的使用與程式設計經驗

想要參加

此課程為 Skill Tree 專屬課程,想要參加者,請隨時注意 Skill Tree 的最新公告

正在開發中

Blazor 全端開發,新手村一日脫逃術

在 Visual Studio 2022 正式版即將推出的時候你有沒有發現 Blazor 經常出現在文件內?Blazor 是微軟全新的全端解決方案,它可以讓 C# 開發者只需要會 C# 就可以達到非常棒的網頁開發能力,它與 Web forms, Silverlight的理念類似,讓開發人員只需要會 C# 就可以完成 Web APP,現在競爭激烈,如何讓開發的經驗可以共通 Blazor 就是一個絕佳的選擇,畢竟僅需要會 .NET / C# 就可以開發 Web App 是件相當誘人因素,尤其讓許多桌面應用程式的開發者頭痛的 JavaScript 在這樣的開發方式下,就變成不是必須的考量了。

不相信 Blazor 的能力,或擔心使用 Blazor 造成技術門檻過高?我們準備了一個講者的真實經驗,你會發現使用 Blazor 是可以降低技術門檻的,也讓團隊補人變的更容易

對於身為 .NET C# 開發者而言,想要成為一個全端網站工程師,將不再是夢想,因為透過 Blazor 框架,不需要會 JavaScript ,便可以輕鬆、容易、快速地完成網站專案開發;Blazor 相較於其他前端網頁開發技術,其學習曲線不會十分陡峭,對於 .NET C# 不太有經驗的人,也是可以輕鬆上手的,現在就讓 SkillTree 一起帶你逃離新手村!

課程大綱

  • 網站開發基本知識回顧
  • 了解網頁之 HTML & CSS 轉譯過程、介紹三種網頁開發架構的比較與分析
  • Blazor 雙開發框架解析
  • Blazor Server
    • 運作原理
    • 專案結構
  • Blazor WebAssembly
    • 運作原理
    • 專案結構
    • 如何挑選 Blazor 架構來進行開發
  • Blazor 預設範本專案解析
    • Counter 元件
    • FetchData 元件
    • Razor 語法
    • Dependency Injection 觀念與用法
  • Blazor 新手必學實戰技能
    • 第一個 Blazor
    • C# 程式碼設計方法
    • 單向資料綁定與重新轉譯
    • 互動與事件設計
    • 元件生命週期事件
    • 元件參數傳遞與回應事件
    • C#/JavaScript 互相呼叫
    • 表單欄位輸入與驗證檢查
    • 頁面間的的導航切換'

等級

入門

需求

  • 具備 C# 程式語言開發經驗
  • 具有 委派 Delegate 與 事件 Event 的知識與使用技術
  • 使用過 LINQ, 非同步開發方式
  • 孰悉 HTML, CSS 語言用法
  • 原則上不需要了解與使用到 JavaScript

想要參加

此課程為 Skill Tree 專屬課程,想要參加者,請隨時注意 Skill Tree 的最新公告

參考網址 : https://skilltree.my/Events/2021/12/11/Blazor-for-Beginners










2022年7月12日 星期二

C# 非同步 : Task.Run 與 Task.Factory.StartNew 傳入一個 async 非同步委派方法的運作差異

 

Task.Run 與 Task.Factory.StartNew 傳入一個 async 非同步委派方法的運作差異

我們知道在 .NET Framework 4.0 的時候,微軟推出了 TPL (Task Parallel Library) 工作平行程式庫 , 而 TPL 存在的目的是透過 .NET Framework 提供的一組 API,並且將這些 API 組合在一個類別庫內,進而簡化平行處理程式設計的方法與設計流程,讓開發人員更有生產力與可以輕鬆地開發出平行、並行、非同步應用的應用程式。

在 .NET Framework 4.0 的時候,可以透過這個工廠方法 Task.Factory 這個屬性所提供的 TaskFactory.StartNew 方法 來建立並取得一個 工作 Task 物件 (建立並啟動所指定動作委派的工作),代表一個非同步的作業;當使用 StartNew 方法的時候,需要傳入一個委派方法,代表這個非同步作業要執行的工作單元。

當 .NET Framework 進入到 4.5 版本的時候,微軟又推出了 Task.Run 方法 ,根據微軟官方的文件上表示,這個方法將會將指定在 ThreadPool 執行工作排入佇列,並傳回該工作的 Task 或 Task<TResult> 控制代碼。

在此同時,微軟同時在 C# 5.0 也推出了 async 修飾詞 與 await 運算子。其目的在於可以讓 .NET 開發者採用同步的方式開發出有效率的非同步應用程式。

然而,對於 Task.Factory.StartNew 與 Task.Run 這兩個取得非同步工作物件的方法,面對於 async 方法的時候,將會有什麼不同問題呢?

首先,來看看同樣皆為 .NET Framework 4.5 推出的 async , await , Task.Run

底下為使用 Task.Run 取得一個 Task 物件,該非同步工作內將會有一個 async 非同步方法,採用 Lambda 來設計,程式碼如下:

var task = Task.Run(async () =>
{
    Console.WriteLine("非同步工作執行開始"); 
    await Task.Delay(3000);
    Console.WriteLine("非同步工作執行完畢"); 
    return "非同步工作";
});
task.Wait();

當執行這個程式的時候,將會得到底下的執行結果

非同步工作執行開始
非同步工作執行完畢
Press any key for continuing...

從輸出結果可以很清楚的看出,一切的執行結果都如同當初所設計的安排所做到的。

一開始建立一個工作物件,該非同步工作指派了一個 async 的非同步委派方法,因為透過 [Task.Run] 來取得的工作物件,因此,該工作已經將會自動啟動與執行。

接下來將會執行 task.Wait() 方法,採用 Block 封鎖等待的方式,等候這個非同步工作的作業完成,因此,對於當前執行緒而言,將不會繼續往下執行任何程式碼。

當 async 非同步方法休息 3 秒鐘之後,將會執行完畢,因此, task.Wait 這個方法將會解除封鎖,繼續往下執行,因此,將會看到上面的輸出結果。

若在 Visual Studio 2022 開發工具中,將游標移動到 Task.Run 方法上,將會看到下面螢幕截圖,這說明了編譯將推論 Task.Run 這個支援方法,將會回傳一個 Task<string> 這個型別的物件回來,這也正是我們想要得到的結果,也是這個 Lambda 非同步方法真正的回傳結果,代表一個非同步的工作物件,該非同步工作物件將會有一個字串的回傳值。

Task.Run

因此,若將 Task.Run 修改成為 Task.Run<string> ,則編譯器也不會出現任何問題,並且執行結果也是相同的。

var task = Task.Run<string>(async () =>
{
    Console.WriteLine("非同步工作執行開始"); 
    await Task.Delay(3000);
    Console.WriteLine("非同步工作執行完畢"); 
    return "非同步工作";
});
task.Wait();

上面的程式碼將會修改 Task.Run 成為 Task.Factory.StartNew

前者的方法將會存在於 .NET Framework 4.5 之後,而後者是在 .NET Framework 4.0 時候推出的。

底下將會是修改後的程式碼,編譯器將不會有任何錯誤產生

var task = Task.Factory.StartNew(async () =>
{
    Console.WriteLine("非同步工作執行開始"); 
    await Task.Delay(3000);
    Console.WriteLine("非同步工作執行完畢"); 
    return "非同步工作";
});
task.Wait();

現在,執行上述程式碼,將會得到底下結果

非同步工作執行開始
Press any key for continuing...
非同步工作執行完畢

很明顯的,這樣的結果並不是當初設計所期望做到的,當初的設計是

  • 建立與啟動一個非同步工作
  • 採用封鎖式等候這個非同步工作執行完成,才會繼續往下執行

從執行結果可以看出,這個封鎖等待並沒有發生效用,並沒有真正的進行等待,而是繼續往下執行。

現在,來探究究竟發生了什麼問題?

同樣的,在 Visual Studio 2022 工具內,將游標移動到 StartNew 這個方法上,將會看到下圖結果

 Task.Factory.StartNew

這表示編譯器推斷 [Task.Factory.StartNew] 這個方法,將會回傳一個 Task<Task<string>> 型別的物件,簡單來說,將會回傳一個工作物件,而該工作物件的回傳值為另為一個回傳為字串的工作物件。

回顧程式碼,當程式碼執行到 await Task.Delay(3000); 敘述的時候,將會立即 Return,因此,對於這樣回傳Task<Task<string>> 型別值的物件,最外面的 Task 表示已經完成了,因為委派方法已經 Return,而該非同步工作內的 Task<string> 回傳字串的非同步工作物件,卻還沒有執行完成,因此, task.Wait(); 當然會繼續往下執行下去。

現在,將程式碼修改成為底下樣式

var task = Task.Factory.StartNew(async () =>
{
    Console.WriteLine("非同步工作執行開始"); 
    await Task.Delay(3000);
    Console.WriteLine("非同步工作執行完畢"); 
    return "非同步工作";
});
Task<string> innerTask = task.Result;
innerTask.Wait();

把上述的程式碼重新執行一次,將會得到如同 Task.Run 相同的輸出結果,也是我們期望的設計結果

非同步工作執行開始
非同步工作執行完畢
Press any key for continuing...

最後,我想要參考如同 Task.Run 的用法,將這個方法改成 Task.Run<string>

也就是,把  Task.Factory.StartNew 改成  Task.Factory.StartNew<string> , 現在來看看會有什麼結果了,底下將會是修改後的程式碼

var task = Task.Factory.StartNew<string>(async () =>
{
    Console.WriteLine("非同步工作執行開始"); 
    await Task.Delay(3000);
    Console.WriteLine("非同步工作執行完畢"); 
    return "非同步工作";
});
task.Wait();

很不幸的,編譯器將會指出發現一個錯誤,錯誤訊息如下

CS4010	無法將非同步 Lambda 運算式 轉換成委派類型 'Func<string>'。非同步 Lambda 運算式 可能會傳回 void、Task 或 Task<T>,而這些都無法轉換成 'Func<string>'。

請問,你知道為什麼會有這樣的錯誤產生嗎?

提示:從前面的文章可以看出端倪喔