首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 多線程程式設計入門:Thread 類核心功能與生命週期管理

     編輯:關於C語言

命名空間

using System.Threading;

核心操作對照表

操作API說明
啟動new Thread(ThreadStart).Start()非同步加入排程器
終止Abort() (過時)拋 ThreadAbortException,不建議使用
休眠Thread.Sleep(ms)釋放 CPU 時間片
優先級Thread.Priority = ThreadPriority.Highest5 級:Lowest/BelowNormal/Normal/AboveNormal/Highest,OS 不保證遵守
掛起Suspend() (過時)危險:可能持有鎖導致死結,已棄用
恢復Resume() (過時)配合 Suspend,已棄用
等待結束Join() / Join(timeout)阻塞呼叫端直到線程終止
狀態檢查ThreadState、IsAliveRunning/WaitSleepJoin/Suspended/Stopped 等
前/背景IsBackgroundtrue=背景線程,主線程結束自動終止

官方範例改良版

using System;
using System.Threading;

public class ThreadExample 
{
    public static void ThreadProc() 
    {
        for (int i = 0; i < 10; i++) 
        {
            Console.WriteLine("ThreadProc: {0}", i);
            Thread.Sleep(0); // 讓出時間片
        }
    }

    public static void Main() 
    {
        Console.WriteLine("Main: Start second thread.");
        Thread t = new Thread(ThreadProc);
        t.Start();
        // Thread.Sleep(0); // 取消註解觀察調度差異

        for (int i = 0; i < 4; i++) 
        {
            Console.WriteLine("Main: Do some work.");
            Thread.Sleep(0);
        }

        Console.WriteLine("Main: Call Join().");
        t.Join();
        Console.WriteLine("Main: ThreadProc ended. Press Enter.");
        Console.ReadLine();
    }
}

輸出範例 (非確定性)

Main: Start second thread.
Main: Do some work.
ThreadProc: 0
Main: Do some work.
ThreadProc: 1
Main: Do some work.
ThreadProc: 2
Main: Do some work.
ThreadProc: 3
Main: Call Join().
ThreadProc: 4
ThreadProc: 5
...
ThreadProc: 9
Main: ThreadProc ended. Press Enter.

現代最佳實踐:棄用 API 的替代方案

棄用 API問題替代方案
Abort()非預期釋放鎖、損壞狀態CancellationToken + 協作式取消
Suspend/Resume死結風險極高Monitor.Wait/Pulse、AutoResetEvent、SemaphoreSlim
Thread.PriorityOS 不保證、優先級反轉任務式並行 Task、TaskScheduler

協作式取消範例

var cts = new CancellationTokenSource();
Thread t = new Thread(() => 
{
    while (!cts.Token.IsCancellationRequested)
    {
        // 工作邏輯
        Thread.Sleep(100);
    }
    Console.WriteLine("Thread exited gracefully.");
});
t.Start();

// 別處需停止時
cts.Cancel();
t.Join(); // 等待優雅退出

Thread vs Task 選擇指南

  • 需要專用線程身分 (STA、特定名稱、長生命週期、COM 互通) → Thread
  • 計算密集/IO 密集並行、需異常傳播、支援 await、取消、續作 → Task / Task.Run
  • 資料並行迴圈 → Parallel.For/ForEach
  • 非阻塞非同步 IO → async/await
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved