2022年7月26日 星期二

在 .NET 程式中,如何讀取到未攔截到例外異常 Exception 發生的時候,當時的詳細狀況

 

在 .NET 程式中,如何讀取到未攔截到例外異常 Exception 發生的時候,當時的詳細狀況

當 .NET 處理程序在執行過程中,產生無法捕捉到的例外異常情況,將會造成該應用程式崩潰,此時,透過 AppDomain 物件內所提供的 UnhandledException 事件 (AppDomain.UnhandledException 事件),將會於該處理程序要結束執行前幾秒,觸發與執行這裡所綁定的委派事件方法,因此,程式設計師可以在這裡進行任何的紀錄或者補救措施,不過,很重要的是,只有短短的幾秒鐘的時間可以來執行。

首先,先來設計一個非同步的多執行緒應用程式,其程式碼如下

Console.WriteLine($"啟動一個非同步執行緒");
ThreadPool.QueueUserWorkItem(_ =>
{
    Console.WriteLine($"   非同步委派方法開始執行");
    Task.Delay(3000).Wait();
    Console.WriteLine($"   模擬呼叫的 API 拋出例外異常");
    throw new Exception("喔喔,發生不明的錯誤");
    Console.WriteLine($"   非同步委派方法結束執行");
});
Console.WriteLine($"等候5秒鐘");
Thread.Sleep(5000);
Console.WriteLine("Press any key for continuing...");
Console.ReadKey();

底下將會是這個程式碼的執行螢幕輸出結果

啟動一個非同步執行緒
等候5秒鐘
   非同步委派方法開始執行
   模擬呼叫的 API 拋出例外異常
Unhandled exception. System.Exception: 喔喔,發生不明的錯誤
   at TD017__未攔截到例外狀況.Program.<>c.<Main>b__0_0(Object _) in C:\Vulcan\Github\CSharp-Thread-Quick-Launch\CSharpThread\TD017  未攔截到例外狀況\Program.cs:line 24
   at System.Threading.QueueUserWorkItemCallbackDefaultContext.Execute()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading.PortableThreadPool.WorkerThread.WorkerThreadStart()
   at System.Threading.Thread.StartCallback()

在這個範例程式碼中,首先將會透過執行緒集區 ThreadPool 來取得一個執行緒,執行這裡所傳入的 Lambda 委派方法

這裡非同步要執行的委派方法將會模擬要處理大量的工作,因此,使用 Task.Delay(3000).Wait() 方法來進行封鎖等待 3 秒鐘,接著,將會使用 throw new Exception("喔喔,發生不明的錯誤"); 敘述來拋出一個例外異常,這裡將會是模擬這個應用程式,在一個非同步的執行緒內,產生一個未知的錯誤,而當時的委派方法內,卻有沒有相對應的 try{...} catch {...} 敘述存在,導致當時無法補中到這樣的例外異常。

因為處理程序中發現到未捕捉到的例外異常,此時,處理程序將會開始進行強制結束執行,結果就是該應用程式突然的結束且不見追跡,並且沒有留下任何的線索,可以得知為什麼這個應用程式突然的掛掉了。

為了要解決這樣的問題,將會把底下的程式碼放到這個應用程式的最前面,使其優先來執行

 AppDomain appDomain = AppDomain.CurrentDomain;
 appDomain.UnhandledException += (s, e) =>
 {
     Console.WriteLine($"接收到 未攔截例外狀況的通知");
     Exception exception = e.ExceptionObject as Exception;
     Console.WriteLine($" > 例外異常訊息 : {exception.Message}");
     Console.WriteLine($" > 當時呼叫堆疊 : {exception.StackTrace}");
 };

在此,先會透過 AppDomain.CurrentDomain 取得當前的 AppDomain 這個類別的執行個體,而 AppDomain 表示應用程式定義域,也就是應用程式執行的獨立環境。

接著透過取得的物件,訂閱了 appDomain.UnhandledException 這個事件,每當預設應用程式域中擲回未處理的例外狀況時,就會叫用這個事件處理常式。

在該事件的委派方法或者處理常式內,可以將當時沒有捕捉到的例外異常訊息記錄到自己常用的 Logger 日誌系統內,或者也可以寫入到本機的檔案內,如此,日後便可以依據這裡的訊息,追查到當時究竟發生了甚麼問題。

在這個例子中,將會把錯誤訊息顯示在螢幕上,底下是執行的螢幕輸出結果

啟動一個非同步執行緒
等候5秒鐘
   非同步委派方法開始執行
   模擬呼叫的 API 拋出例外異常
接收到 未攔截例外狀況的通知
 > 例外異常訊息 : 喔喔,發生不明的錯誤
 > 當時呼叫堆疊 :    at TD017__未攔截到例外狀況.Program.<>c.<Main>b__0_1(Object _) in C:\Vulcan\Github\CSharp-Thread-Quick-Launch\CSharpThread\TD017  未攔截到例外狀況\Program.cs:line 24
   at System.Threading.QueueUserWorkItemCallbackDefaultContext.Execute()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading.PortableThreadPool.WorkerThread.WorkerThreadStart()
   at System.Threading.Thread.StartCallback()
Unhandled exception. System.Exception: 喔喔,發生不明的錯誤
   at TD017__未攔截到例外狀況.Program.<>c.<Main>b__0_1(Object _) in C:\Vulcan\Github\CSharp-Thread-Quick-Launch\CSharpThread\TD017  未攔截到例外狀況\Program.cs:line 24
   at System.Threading.QueueUserWorkItemCallbackDefaultContext.Execute()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading.PortableThreadPool.WorkerThread.WorkerThreadStart()
   at System.Threading.Thread.StartCallback()








2022年7月25日 星期一

C# 非同步 : 在進行 WPF / Windows Forms / Xamarin.Forms 專案開發,可以回到 UI 執行緒來更新 UI 控制項的相同作法

 

在進行 WPF / Windows Forms / Xamarin.Forms 專案開發,可以回到 UI 執行緒來更新 UI 控制項的相同作法

在以往,若再不同 GUI 開發框架下,想要在非同步的多執行緒程式碼下,更新 UI 控制項的屬性,若當前的執行緒不是所謂的 主執行緒 或者 稱之為 UI 執行緒,將會得到 System.InvalidOperationException: '呼叫執行緒無法存取此物件,因為此物件屬於另一個執行緒。' 這樣的例外異常訊息,所以,大家第一時間想到的就是每個開發框架都會有提供這樣相對應的程式碼,可以指定一段委派方法,讓這些程式碼在 UI 執行緒下來執行,而不是在多執行緒下的某個執行緒來執行,例如:

  • Windows Forms

    這裡將會再多執行緒程式碼內,使用 Control.Invoke 方法 來做到,這個方法可以傳入一個委派方法,而該委派方法的程式碼將會在 主執行緒 或者 UI 執行緒 下來執行

  • WPF Windows Presentation Foundation

    在這個開發框架下,將會使用 Dispatcher.Invoke 方法 來做到,同樣的,這個方法可以傳入一個委派方法,而該委派方法的程式碼將會在 主執行緒 或者 UI 執行緒 下來執行

而是否有個簡單與通用的設計做法,不論在哪個開發框架下,都可以使用相同的程式設計代碼,指定一個委派方法,讓這個委派方法可以在 UI 執行緒下來執行。

建立一個 WPF 的專案

為了要說明上面描述的內容,首先,建立一個 WPF 專案

在這個 WPF 專案內找到 [MainWindow.xaml] 檔案,打開這個檔案,使用底下的 XAML 來替換

<Window x:Class="WpfApp2.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp2"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <TextBlock x:Name="textBlock" Text="Start"
                   FontSize="30" />
        <Button x:Name="btn" Content="OK" Width="200" Height="70"
                Click="btn_Click"
                />
    </Grid>
</Window>

在這個 XAML 檔案內,將會宣告兩個 UI 控制項,一個是 [TextBlock] ,一個是 [Button] 。

在這裡的設計情境將會是,當使用者按下這個 OK 按鈕之後,便會開始執行一個非同步的作業,在這個非同步的多執行緒程式碼中,將會建立一個迴圈,反覆執行 10 次,每次的迴圈,將會把當前的迴圈索引值,指定到 [textBlock] 這個 UI 控制項內,如此,便可以從螢幕上看到當前的迴圈索引值是多少。

在這裡將會分別採用 ThreadPool 執行緒集區 與 Task 工作來實作這個非同步之多執行緒作業,並且比較兩者的差異。

使用工作物件 Task.Run 來建立一個非同步作業

切換到 [MainWindow.xaml] 的 Code Behind 程式碼編輯視窗內,將會看到下面的程式碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp2
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void btn_Click(object sender, RoutedEventArgs e)
        {
        }
    }
}

現在,在 btn_Click 按鈕事件常式內,使用 Task.Run 來建立一個非同步工作物件,做到上面所提到的一個迴圈與更新迴圈索引值到畫面上的需求

將底下的程式碼加入到 btn_Click 事件內,雖然這裡使用了 await Task.Delay(1000); 這樣的敘述,但不影響整個實驗結果,當然,可以改寫成為封鎖 Block 等待 Task.Delay(1000).Wait(); 敘述。

private void btn_Click(object sender, RoutedEventArgs e)
{
    var task = Task.Run(async () =>
    {
        for (int i = 0; i < 10; i++)
        {
            await Task.Delay(1000);
            textBlock.Text = i.ToString();
        }
    });
}

現在,可以執行這個 WPF 專案,一旦應用程式啟動成功後,點選視窗中的 OK 按鈕

沒意外的話,應用程式沒有當掉,並且螢幕也沒有任何變化,為什麼會是這樣的情況呢?

若讀者對於 非同步工作 Task 這個類別夠孰悉的話,將會知道,這個工作物件在非同執行所傳入的委派方法的時候,若該委派方法產生了例外異常,這個工作執行個體將會蒐集當時的例外異常資訊,並且不會讓整個應用程式造成崩潰,這也就是為什麼會有這樣的執行結果了。

若你對於 非同步工作 Task 不太孰悉,建議可以來參加我開設的 精準解析 .NET Task 工作 課程

現在,將 btn_Click 這個事件委派方法內,使用 執行緒 集區來建立一個非同步多執行緒作業,看看剛剛用於 Task 物件內的相同委派方法程式碼,在執行緒下會有甚麼結果呢?

請將底下程式碼替換掉 btn_Click 事件內的程式碼

private void btn_Click(object sender, RoutedEventArgs e)
{
    ThreadPool.QueueUserWorkItem(async _ =>
    {
        for (int i = 0; i < 10; i++)
        {
            await Task.Delay(1000);
            textBlock.Text = i.ToString();
        }
    });
}

讓我們來執行這個專案,並且按下 OK 按鈕,看看會有甚麼情況發生。

很不幸的,當按下 OK 按鈕的之後,這個應用程式崩潰了,Visual Studio 2022 出現底下的畫面

Visual Studio 2022

例外異常的訊息文字為

System.InvalidOperationException: '呼叫執行緒無法存取此物件,因為此物件屬於另一個執行緒。'

從這裡的錯誤訊息可以得知,在 GUI 應用程式下,例如 Windows Forms , WPF , Xamarin.Forms 開發框架下, 想要修改 UI 控制項的屬性,該段程式碼必須要在 UI 執行緒下來執行,否則,就會造成上面的錯誤與得到上面的錯誤訊息。

為了要解決這個問題,在這裡將會採用一種做法,這種作法將會適用於不同 UI 開發框架下,皆可使用。

這個方法就是採用 同步內容 SynchronizationContext ,請將底下程式碼替換掉 btn_Click 方法內的程式碼

private void btn_Click(object sender, RoutedEventArgs e)
{
    #region 記錄下當前的 SynchronizationContext
    SynchronizationContext context = SynchronizationContext.Current;
    #endregion
    ThreadPool.QueueUserWorkItem(async _ =>
    {
        for (int i = 0; i < 10; i++)
        {
            await Task.Delay(1000);
            #region 透過同步內容來更新 UI 屬性
            context.Post(_ =>
            {
               textBlock.Text = i.ToString();
            }, null);
            #endregion
        }
    });
}

上面的程式碼會在使用者點選 OK 按鈕之後開始執行,首先,使用 SynchronizationContext.Current 取得當前的 SynchronizationContext 物件,從微軟文件上得知,這個類別提供在各種同步處理模式中散佈同步處理內容的基本功能,而這個物件內有個 SynchronizationContext.Post(SendOrPostCallback, Object) 方法 ,其會將非同步訊息分派至同步處理內容。

了解完成 SynchronizationContext 這個物件用法,可以來執行這個專案,將會看到底下的正確無誤的執行過程。

因此,若想要使用單一做法,在不同 UI 開發框架下做到非同步多執行緒程式碼,可以順利更新 UI 控制項內容,可以使用 SynchronizationContext 來嘗試看看。





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