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

C# 多線程程式設計:Thread 基礎與同步鎖定實戰

     編輯:關於C#

範例一:單一執行緒建立與啟動


using System;
using System.Threading;

class SingleThread
{
    static void Main(string[] args)
    {
        var st = new SingleThread();
        var th = new Thread(new ThreadStart(st.SayHello));
        th.Start();
    }

    public void SayHello() => Console.WriteLine("Hello from a single thread.");
}

範例二:多線程共享資料同步 (lock)


using System;
using System.Threading;

class SyncData
{
    int index = 0;
    string[] comments = { "一", "二", "三", "四", "五", "六", "七", "八", "九", "十",
        "十一", "十二", "十三", "十四", "十五", "十六", "十七", "十八", "十九", "二十" };

    public string GetNetComment()
    {
        lock (this) // 同步鎖定
        {
            if (index < comments.Length)
                return comments[index++];
            return "empty";
        }
    }
}

class Synchronization
{
    SyncData sdat = new SyncData();

    public void GetComments()
    {
        string comment;
        do
        {
            comment = sdat.GetNetComment();
            Console.WriteLine($"Current Thread: {Thread.CurrentThread.Name}, comment: {comment}");
        } while (comment != "empty");
    }

    static void Main(string[] args)
    {
        var sync = new Synchronization();
        var t1 = new Thread(new ThreadStart(sync.GetComments)) { Name = "Thread 1" };
        var t2 = new Thread(new ThreadStart(sync.GetComments)) { Name = "Thread 2" };
        var t3 = new Thread(new ThreadStart(sync.GetComments)) { Name = "Thread 3" };
        t1.Start(); t2.Start(); t3.Start();
    }
}

核心概念解析

概念說明
ThreadStart 委派指向無參數、無回傳值的方法,作為執行緒進入點
Thread.Start()將執行緒加入排程器,非同步返回,實際執行時間不確定
lock(obj)取得物件的互斥鎖,確保同一時間只有一個執行緒進入 critical section
Thread.CurrentThread.Name除錯時識別執行緒的好幫手,Visual Studio 執行緒視窗直接顯示

現代 C# 非同步替代方案

  • Task / Task<T>:Task.Run(() => DoWork()) 取代 new Thread,支援 await、續標、例外傳播、執行緒池複用。
  • async / await:非同步 I/O 不阻塞執行緒,延展性遠優於手動 Thread。
  • Parallel.ForEach / PLINQ:資料平行處理自動分割工作負載。
  • SemaphoreSlim / ReaderWriterLockSlim:比 lock 更精細的同步控制(非同步支援、讀寫分離)。
  • Concurrent 集合:ConcurrentDictionary、ConcurrentQueue 等無鎖/細粒度鎖實作,避免手寫 lock。

⚠️ Thread 直接使用的缺點

  1. 建立/銷毀開銷大,無池化機制
  2. 例外處理困難(需在執行緒內部 try-catch)
  3. 難以取消、等待、組合多個非同步操作
  4. UI 執行緒同步需 Control.Invoke / Dispatcher 易出錯

結論:教學理解 Thread 基礎機制;生產代碼優先使用 Task/async-await 體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved