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

2022年9月2日 星期五

如何設計有效的 Parallel.ForEachAsync 迴圈 - 需要使用平行計算方式來執行 async Method 非同步方法

如何設計有效的 Parallel.ForEachAsync 迴圈 - 需要使用平行計算方式來執行 async Method 非同步方法

對於要使用 [Parallel.ForEach] 來設計出一個具有平行作業的應用程式,相信對於許多 .NET C# 開發者而言,應該不是個很大的問題,此時,可以參考 如何:撰寫簡單的 Parallel.ForEach 迴圈 這篇文章中的說明與範例程式碼,相信可以很容易得輕鬆上手。

可是對於 Parallel.ForEach 方法 的使用,需要傳入至少一個列舉 IEnumerable 與一個委派方法,不過,在這裡若是設計使用同步方法來進行設計程式碼,相信執行上一切都沒有問題, Parallel.ForEach 方法將會使用平行計算的方式,使用列舉物件內的值,平行執行與傳入到這個委派方法,但是,當這個委派方法已經改成一個非同步方法,也就是在這個委派方法有加入了 async 這個修飾詞,那麼將會發現到,一旦執行到 Parallel.ForEach 之後,將會馬上就執行到下一行敘述,不會等到所有的列舉物件都執行完成後,才會繼續往下執行

對於使用同步委派方法來設計 Parallel.ForEach 的應用,可以參考底下的範例程式碼

#region 若在 Parallel.Foreach 內使用同步方式進行委派方法的設計,會等到所有委派方法都執行完畢後,才會繼續往下執行
Console.WriteLine($"使用 Parallel.Foreach 與同步委派方法 開始 {DateTime.Now}");
Parallel.ForEach(Enumerable.Range(0, 3), async (x, t) =>
{
    Console.WriteLine("  Bpfsync");
    Thread.Sleep(3000);
    Console.WriteLine("  Cpfsync");
});
// 當看到這行敘述,表示 Parallel.ForEach 已經結束執行,不過,將還沒看到所有的 Cpf 文字輸出
Console.WriteLine($"使用 Parallel.Foreach 與同步委派方法 結束 {DateTime.Now}");

在這裡,將會使用 Enumerable.Range(0, 3) 一個列舉物件,且這個列舉物件內有三個值,並使用 Lambda 指定一個委派方法,該方法將會使用 Thread.Sleep(3000) 模擬該方法需要花費三秒鐘的時間來執行某些工作,整個 Lambda 委派方法將會是使用同步方式來進行運行。

從底下的執行結果可以看出,一旦 Parallel.ForEach 開始執行之後,將會平行執行 Enumerable.Range(0, 3) 列舉物件內的每個值,

使用 Parallel.Foreach 與同步委派方法 開始 2000/9/2 上午 09:23:09
  Bpfsync
  Bpfsync
  Bpfsync
  Cpfsync
  Cpfsync
  Cpfsync
使用 Parallel.Foreach 與同步委派方法 結束 2000/9/2 上午 09:23:12

若將程式碼改成如下,將每個平行執行的傳入物件值顯示出來

#region 若在 Parallel.Foreach 內使用同步方式進行委派方法的設計,會等到所有委派方法都執行完畢後,才會繼續往下執行
Console.WriteLine($"使用 Parallel.Foreach 與同步委派方法 開始 {DateTime.Now}");
Parallel.ForEach(Enumerable.Range(0, 3), async (x, t) =>
{
    Console.WriteLine($"  Bpfsync {x}");
    Thread.Sleep(3000);
    Console.WriteLine($"  Cpfsync {x}");
});
// 當看到這行敘述,表示 Parallel.ForEach 已經結束執行,不過,將還沒看到所有的 Cpf 文字輸出
Console.WriteLine($"使用 Parallel.Foreach 與同步委派方法 結束 {DateTime.Now}");
#endregion

這裡將會是上面程式碼執行後的結果,從這裡可以再度驗證與得到一個結論, Parallel.ForEach 確實逐一平行來執行美個委派方法,可以在平行執行作業過程中,是每有說哪個執行緒必須一定要先執行,或者要按著當初啟動的順序來逐一平行執行的慣例或者說法。

使用 Parallel.Foreach 與同步委派方法 開始 2000/9/2 上午 09:34:12
  Bpfsync 0
  Bpfsync 1
  Bpfsync 2
  Cpfsync 0
  Cpfsync 2
  Cpfsync 1
使用 Parallel.Foreach 與同步委派方法 結束 2000/9/2 上午 09:34:15

現在將要平行運行的委派方法改成非同步委派方法,因此,原先使用 Thread.Sleep(3000) 這個敘述,將會改成使用 await Task.Delay(3000) 這樣的敘述,然而,因為使用了 await 運算子,所以,就需要在委派方法前面加上 async 修飾詞,底下將會是這樣的程式碼

#region 若在 Parallel.Foreach 內使用 async 方法,將會立即結束平行敘述,相關程式碼會在背景執行中
Console.WriteLine($"使用 Parallel.Foreach 開始 {DateTime.Now}");
Parallel.ForEach(Enumerable.Range(0, 3), async (x, t) =>
{
    Console.WriteLine($"  Bpf {x}");
    await Task.Delay(3000);
    Console.WriteLine($"  Cpf {x}");
});
// 當看到這行敘述,表示 Parallel.ForEach 已經結束執行,不過,將還沒看到所有的 Cpf 文字輸出
Console.WriteLine($"使用 Parallel.Foreach 結束 {DateTime.Now}");
#endregion


#region 故意休息五秒,等待上述的平行作業全部都結束
Console.WriteLine();
Console.WriteLine($"休息 五秒鐘");
await Task.Delay(5000);
Console.WriteLine();

因為若在 Parallel.Foreach 內使用 async 方法,將會立即結束平行敘述,相關委派方法內程式碼會仍在背景執行中,因此,無法透過 Parallel.ForEach 來得知是否所有的平行運算都已經全部完成了;由於平行計算模擬花費 3 秒計算時間,而這三秒將會在背景下運行,因此,這裡使用 await Task.Delay(5000) 這樣的敘述,故意休息五秒,等待上述的所有背景平行作業全部都結束,因此將會看到底下的輸出結果;從執行結果可以看出,當 [休息 五秒鐘] 文字顯示之後,並且真的讓當前執行緒強制睡眠五秒鐘之後,約在三秒之後,就會看到每個委派方法執行結束的文字輸出。

使用 Parallel.Foreach 開始 2022/9/2 上午 09:34:15
  Bpf 0
  Bpf 2
  Bpf 1
使用 Parallel.Foreach 結束 2022/9/2 上午 09:34:15

休息 五秒鐘
  Cpf 2
  Cpf 0
  Cpf 1

為了解決這樣的應用,在 .NET 6 的 BCL 中,將會提供了 Parallel.ForEachAsync 方法 ,透過這個方法,將會可以做到使用 Parallel 類別提供的功能,並且使用非同步的方法來平行執行委派方法

#region 這裡使用 Parallel.ForEachAsync 來平行非同步方法,將不會有上述問題,全部的非同步作業都平行執行完畢,該行敘述才會繼續往下執行,這可以從時間戳記看出
Console.WriteLine($"使用 Parallel.ForEachAsync 開始 {DateTime.Now}");
await Parallel.ForEachAsync(Enumerable.Range(0, 3), async (x, t) =>
{
    Console.WriteLine($"  Bpfa {x}");
    await Task.Delay(3000);
    Console.WriteLine($"  Cpfa {x}");
});
Console.WriteLine($"使用 Parallel.ForEachAsync 結束 {DateTime.Now}");
#endregion

在這裡將會使用 await Parallel.ForEachAsync 來使用非封鎖方式來等待所有的平行作業都執行完畢,而且這些要採用平行執行的委派方法,都將採用非同步方法(有 async 修飾詞的方法)來設計。

從底下的執行結果,應該是當初需求所期望能夠設計出來的功能

使用 Parallel.ForEachAsync 開始 2000/9/2 上午 09:34:20
  Bpfa 0
  Bpfa 1
  Bpfa 2
  Cpfa 2
  Cpfa 1
  Cpfa 0 

使用 Parallel.ForEachAsync 結束 2000/9/2 上午 09:34:27 





2022年7月28日 星期四

C# : 當要進行背景服務程式碼設計的時候,是否要使用 await 運算子呢?

當要進行背景服務程式碼設計的時候,是否要使用 await 運算子呢?

這篇文章是記錄我之前在進行 ASP.NET Core 中使用託管服務的背景工作 程式碼設計的時候,想要設計一個背景服務,這個程式將會每隔一段時間來檢查是否有使用者的帳號已經密碼過期,或者需要強制登出的請求出現,此時,這個背景服務程式將會設定這個帳號需要強制登出;若是帳號密碼過期的問題,則該帳號再重新登入的時候,將會要求重新變更帳號密碼,否則無法進行登入。

對於這樣的需求,一開始的想法是,我需要自己 new Thread 這個執行個體出來,產生出一個前景執行緒,因為,在這裡需要進行長時間的處理工作。另外,不去使用執行緒集區來取得一個被景執行緒的原因,那就是這個執行緒會長時間運行,若該執行緒來自於執行緒集區,則該集區內的執行緒便會少了一個可用執行緒資源。

然而,這樣的設計理念雖然很好,很快地就遇到問題,那就是在這個前景執行緒中,因為某些需要,便要呼叫一些非同步的 API ,而這些 API 是可以適用於 async / await 的方式,理所當然的就直接使用這樣的作法把他呼叫下去。

當專案設計完成與正式執行之後,也沒有發現到甚麼異常現象產生,畢竟,在這個前景執行緒的程式碼內,比較沒有存取共用資源的競賽問題,也就是沒有執行緒安全的問題產生。可是,總是感覺怪怪的,畢竟,大家都知道,當程式碼執行到 await 運算子這個關鍵字後,將會做三件事情

  1. 記住離開的執行程式碼位置
  2. 捕捉當前執行內容
  3. 立即 return 返回。

當 await 所等待的這個非同步工作或者方法完成之後,將會做三件事情

  1. 從工作排程器取得一個可以繼續執行緒
  2. 還原之前執行內容
  3. 從剛剛中斷的地方繼續往下執行。

一旦看完剛剛所提到的事情之後,那麼一開始建立一個前景執行緒的動作不就白做了嗎?

因為只要在這個前景執行緒所指定的 Unit Of Work 工作單元 / 委派方法內,使用 await 關鍵字,並且在這個委派方法外加入 async 關鍵字,那麼,執行完成 await 關鍵字之後,前景執行緒也就不再存在了,之後的程式碼都會來自於 工作排成器 Task Scheduler 預設將會從 執行緒集區 取得一個可用的執行緒來繼續執行下去。

為了要驗證這樣的情況,特別設計一個主控台應用程式的專案,其程式碼如下

namespace Background_Service_New_Thread_Await
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Thread thread = new Thread(async () =>
            {
                Thread.CurrentThread.Name = "新 new Thread 的處理服務用執行緒(非來自執行緒集區)";
                Console.WriteLine($"開始進行背景服務程式執行");
                // 模擬這個背景服務要處理的同步程式碼執行動作
                Thread.Sleep(2000);
                Console.WriteLine($"準備進行非同步 await 呼叫");
                Console.WriteLine();

                ShowThreadInformation("呼叫 await 前,new Thread 的相關資訊");

                // 模擬要使用 await 來進行非同步呼叫
                await Task.Delay(3000);

                ShowThreadInformation("呼叫 await 後,new Thread 的相關資訊");
            });
            thread.Start();

            Console.WriteLine("Press any key for continuing...");
            Console.ReadKey();
        }

        // 將當前的執行緒資訊顯示出來
        static void ShowThreadInformation(string message)
        {
            Console.WriteLine(message);
            Console.WriteLine($"執行緒 Id : {Thread.CurrentThread.ManagedThreadId}");
            Console.WriteLine($"執行緒名稱 : {Thread.CurrentThread.Name}");
            Console.WriteLine($"來自集區 : {Thread.CurrentThread.IsThreadPoolThread}");
            Console.WriteLine($"為背景執行緒 : {Thread.CurrentThread.IsBackground}");
            Console.WriteLine();
        }
    }
}

在上面的程式碼,設計的一個 [ShowThreadInformation] 方法,這個方法會將當前執行緒的 Id , 名稱 Name , 是否該執行緒來自於執行緒集區 、 該執行緒是否為背景執行緒 資訊顯示在螢幕上。

在主執行緒內,首先使用 new Thread 運算式來建立一個執行緒物件,在該執行緒所綁定的委派方法內,將會使用 await Task.Delay(3000); 敘述來執行 await 的工作,並且在這個 Lambda 委派方法上,使用了 async 修飾詞 async ()=> {...} 標明這個委派方法,是一個非同步方法。

而在執行 await 運算式的前後,將會呼叫 [ShowThreadInformation] 方法,顯示當前執行緒的資訊。

現在可以執行這個專案,將會看到底下的執行內容

Press any key for continuing...
開始進行背景服務程式執行
準備進行非同步 await 呼叫

呼叫 await 前,new Thread 的相關資訊
執行緒 Id : 10
執行緒名稱 : 新 new Thread 的處理服務用執行緒(非來自執行緒集區)
來自集區 : False
為背景執行緒 : False

呼叫 await 後,new Thread 的相關資訊
執行緒 Id : 6
執行緒名稱 : .NET ThreadPool Worker
來自集區 : True
為背景執行緒 : True

從執行結果可以看的出來,在呼叫 await 之前,當前的執行緒卻是為前景執行緒,並且不是來自於執行緒集區內,另外,在該執行緒執行後,就會執行 Thread.CurrentThread.Name = "新 new Thread 的處理服務用執行緒(非來自執行緒集區)"; 敘述,設定這個執行緒 Name 的屬性值,這樣的設定結果,可以從執行結果看的出來。

當 await 執行完成後,再度顯示當前執行緒的狀態,發現到現在的執行緒 ID 已經改變了,名稱也不對了,最重要的是這個執行緒來自於執行緒集區,而且是個背景執行緒。 




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