首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# 多執行緒傳遞參數錯誤:ThreadStart 委派正確用法

     編輯:程式設計綜合問答

錯誤代碼

Thread th1 = new Thread(new ThreadStart(H.顯示(線程計數器))); // ❌ 立即執行方法,傳回 void 給 ThreadStart

原因

H.顯示(線程計數器) 是**方法呼叫**,會立即執行並回傳 void,而 ThreadStart 需要**無參無回傳的方法群組**。

正確寫法 (三種)

  1. Lambda 運算式 (推薦):
    Thread th1 = new Thread(() => H.顯示(線程計數器));
    
  2. ParameterizedThreadStart (需轉型):
    Thread th1 = new Thread(obj => H.顯示((int)obj));
    th1.Start(線程計數器);
    
  3. 區域變數捕獲 (避免閉包陷阱):
    int num = 線程計數器;
    Thread th1 = new Thread(() => H.顯示(num));
    

完整範例

class 函數庫 {
    public void 顯示(int i) {
        Console.WriteLine($"這是第{i}個執行緒");
        Thread.Sleep(2000);
        Console.WriteLine($"第{i}個執行緒結束");
    }
}

static void Main() {
    var h = new 函數庫();
    for (int i = 1; i <= 3; i++) {
        int captured = i; // 重要:捕獲區域副本
        new Thread(() => h.顯示(captured)).Start();
    }
    Console.ReadKey();
}

常見坑

迴圈中直接捕獲 i 會導致所有執行緒看到相同最終值,必須建立區域變數副本。

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