C# - 多線程:初學者指南

你好,未來的 C# 開發者們!今天,我們將踏上一段令人興奮的旅程,進入多線程的世界。別擔心這聽起來嚇人——我將成為你的友好導遊,我們會一步步來。到了這個教學的結尾,你將會像專家一樣進行多線程操作!

C# - Multithreading

什麼是 多線程?

在我們深入之前,讓我們先了解什麼是 多線程。想像你正在烹飪一頓複雜的餐點。你會一次只做一個任務嗎?你可能會在爐子上煮義大利麵,同時切蔬菜並留意外面的醬汁。這就是多任務處理,在編程的世界中,我們稱之為 多線程。

多線程讓一個程序能夠同時執行多個任務。這就像廚房裡有許多廚師,每個人都負責餐點的不同部分。

線程生命週期

就像我們人類一樣,線程也有生命週期。讓我們來拆解它:

  1. 出生 (New):線程被創建但尚未開始。
  2. 就緒 (Ready):線程準備好運行並等待 CPU 時間。
  3. 運行中 (Running):線程正在執行它的任務。
  4. 阻塞 (Blocked):線程暫時停止(也許正在等待某些資源)。
  5. 死亡 (Dead):線程完成了它的任務,不再運行。

這裡有一個簡單的可視化:

New -> Ready -> Running -> Dead
^        |
|        v
<-- Blocked

主線程

當你啟動一個 C# 程序時,它會自動創建一個稱為 主線程 的線程。這就像我們廚房比喻中的主廚。讓我們看看它是如何工作的:

using System;
using System.Threading;

class Program
{
static void Main(string[] args)
{
Console.WriteLine("主線程: " + Thread.CurrentThread.ManagedThreadId);
}
}

當你運行這段代碼時,你會看到類似於以下內容:

主線程: 1

這顯示我們的程序正在 主線程 上運行,其 ID 總是為 1。

Thread 类的屬性和方法

C# 中的 Thread 類帶有一系列有用的屬性和方法。讓我們看看一些最常見的:

屬性/方法 描述
ManagedThreadId 獲取線程的唯一標識符
IsAlive 指示此線程是否已啟動且尚未終止
Name 獲取或設置線程的名稱
Priority 獲取或設置線程的調度優先級
Start() 啟動線程
Sleep() 指定時間內挂起線程
Join() 阻塞調用線程直到此線程終止

讓我們看看其中一些是如何工作的:

using System;
using System.Threading;

class Program
{
static void Main(string[] args)
{
Thread t = new Thread(DoWork);
t.Name = "工作線程";
Console.WriteLine("啟動線程...");
t.Start();
t.Join();
Console.WriteLine("線程結束");
}

static void DoWork()
{
Console.WriteLine($"線程 {Thread.CurrentThread.Name} 正在工作");
Thread.Sleep(1000);
Console.WriteLine($"線程 {Thread.CurrentThread.Name} 完成工作");
}
}

這個程序創建了一個新線程,命名它,啟動它,等待它完成,然後繼續。輸出將會是:

啟動線程...
線程 工作線程 正在工作
線程 工作線程 完成工作
線程結束

創建線程

在 C# 中創建線程就像為我們的廚房招聘新廚師。這是我們如何做到的:

using System;
using System.Threading;

class Program
{
static void Main(string[] args)
{
// 使用命名方法創建線程
Thread t1 = new Thread(DoWork);
t1.Start();

// 使用匿名方法創建線程
Thread t2 = new Thread(() =>
{
Console.WriteLine("線程 2 正在工作");
});
t2.Start();

// 帶參數創建線程
Thread t3 = new Thread(param =>
{
Console.WriteLine($"線程 3 說: {param}");
});
t3.Start("來自線程 3 的問候!");
}

static void DoWork()
{
Console.WriteLine("線程 1 正在工作");
}
}

這個例子展示了三種不同的方式來創建線程。運行它並看看會發生什麼!

管理線程

有效地管理線程對於多線程編程至關重要。讓我們看看一些管理線程的方法:

using System;
using System.Threading;

class Program
{
static void Main(string[] args)
{
Thread t = new Thread(DoWork);
t.Start();

// 等待線程完成
t.Join();

// 設置線程優先級
t.Priority = ThreadPriority.Highest;

// 檢查線程是否存活
Console.WriteLine($"線程是否存活? {t.IsAlive}");

// 使主線程暫停
Thread.Sleep(1000);
}

static void DoWork()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine($"工作... {i}");
Thread.Sleep(500);
}
}
}

這個例子展示了如何等待線程完成,設置其優先級,檢查其狀態,以及使線程暫停。

销毁线程

在 C# 中,我們通常不會手動“銷毀”線程。線程會在完成其工作或應用程序退出時自動終止。然而,我們可以使用 Abort() 方法請求停止線程,但不推薦這樣做,因為可能會有資源清理的問題。

以下是如何使用 Abort() 的例子,但記住,最好是設計線程自然完成:

using System;
using System.Threading;

class Program
{
static void Main(string[] args)
{
Thread t = new Thread(DoWork);
t.Start();

Thread.Sleep(2000); // 讓線程運行 2 秒鐘

t.Abort(); // 中止線程
Console.WriteLine("線程中止");
}

static void DoWork()
{
while (true)
{
Console.WriteLine("工作...");
Thread.Sleep(500);
}
}
}

這會在線程運行大約 2 秒鐘後中止它。

以上就是你的 C# 多線程入門教學。記住,就像學習烹飪一樣,精通多線程需要練習。所以不要害怕嘗試這些概念。快樂編程,願你的線程總是運行順暢!

Credits: Image by storyset