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

C# 執行緒管理完整指南:建立、啟動、暫停、恢復、等待與銷毀

     編輯:關於C語言

Thread 類別核心 API

操作方法/屬性說明
建立new Thread(ThreadStart)委派指向無參數無回傳方法
帶參數建立new Thread(ParameterizedThreadStart)委派簽章 void(object)
啟動Start() / Start(object)非同步啟動,立即返回
暫停(舊)Suspend()已棄用,易造成死結
恢復(舊)Resume()已棄用
睡眠Sleep(ms) / Sleep(Timeout.Infinite)當前執行緒讓出 CPU
中斷睡眠Interrupt()喚醒目標執行緒,拋 ThreadInterruptedException
等待結束Join() / Join(ms) / Join(TimeSpan)阻塞呼叫端直到目標結束
強制終止Abort()拋 ThreadAbortException,ResetAbort() 可取消
取消模式CancellationToken現代優雅取消,協作式

基本範例


using System;
using System.Threading;

class Program {
    static void Worker() {
        for (int i = 0; i < 10; i++) {
            Console.WriteLine($"Working {i}");
            Thread.Sleep(500);
        }
    }

    static void Main() {
        Thread t = new Thread(Worker);
        t.Start();
        t.Join(3000); // 等待 3 秒
        if (t.IsAlive) {
            Console.WriteLine("Timeout, aborting...");
            t.Abort();
            t.Join();
        }
        Console.WriteLine("Done");
        Console.ReadKey();
    }
}

暫停/恢復棄用原因與替代方案


// ❌ 危險:Suspend/Resume 可能在持有鎖時暫停,導致死結
// thread.Suspend();
// thread.Resume();

// ✅ 現代模式:CancellationToken
var cts = new CancellationTokenSource();
Thread t = new Thread(() => {
    while (!cts.Token.IsCancellationRequested) {
        DoWork();
        Thread.Sleep(100);
    }
});
t.Start();
// 稍後...
cts.Cancel(); // 通知取消
t.Join();     // 等待優雅結束

Thread.Join 詳細行為

  • Join():無限期等待
  • Join(ms):等待指定毫秒,超時返回 false
  • Join(TimeSpan):同上
  • 若目標執行緒已結束,立即返回 true
  • 死結風險:A Join B,B Join A → 永久阻塞

前景 vs 背景執行緒

屬性前景執行緒背景執行緒
預設new Thread(...)IsBackground = true
進程退出等待所有前景執行緒結束直接終止,不等待
用途主要業務邏輯輔助工作、監聽、定時器

執行緒池:避免頻繁建立銷毀


// 佇列工作項目
ThreadPool.QueueUserWorkItem(_ => {
    DoBackgroundWork();
});

// .NET 4+ Task 基礎設施(建議)
Task.Run(() => DoBackgroundWork());
Task.Factory.StartNew(() => DoBackgroundWork(), TaskCreationOptions.LongRunning);
  • 執行緒池自動管理工作者執行緒數量
  • 適合短時作業;長時間運行用 TaskCreationOptions.LongRunning 建立專用執行緒

同步化原語速查

原語用途關鍵方法
lock / Monitor互斥鎖Enter/Exit, Wait/Pulse
Mutex跨進程互斥WaitOne/ReleaseMutex
Semaphore / SemaphoreSlim訊號量/限流Wait/Release
AutoResetEvent / ManualResetEvent事件通知WaitOne/Set/Reset
ReaderWriterLockSlim讀寫鎖EnterReadLock/EnterWriteLock
Interlocked原子操作Increment/Exchange/CompareExchange

最佳實踐總結

  1. 優先使用 Task/async-await 而非手動 Thread
  2. 取消用 CancellationToken,勿用 Abort/Suspend
  3. 共享狀態用 lock 或無鎖 Interlocked/Concurrent*
  4. 背景工作設 IsBackground = true
  5. 避免 Thread.Sleep 做同步,改用 WaitHandle/Task.Delay
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved