2015-08-13 39 views
1

我是新來的多線程,我有一個非常簡單的代碼意想不到的結果:基本多線程代碼工作不正常

public void Run() 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      Thread t = new Thread(() => myFun((i + 1))); 
      t.Start(); 
     } 
    } 

    private void myFun(int threadNo) 
    { 
     Console.WriteLine("Thread #" + threadNo.ToString()); 
    } 

有人能解釋我爲什麼上面打印此控制檯窗口中的代碼?

線程#3

線程#3

線程#3

線程#6

線程#6

線程#8

線程#9

線程#10

線程#11

線程#11

+0

很顯然我希望線程#1線程#2 .. 3 ... 4 ... 5 ... 6 ... 7 ... 8 ... 9 ... 10 – Jonathan

回答

4

這是因爲您使用的是拉姆達這closes over the loop variable

重構你的代碼這樣:

public void Run() 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     int j = i; 
     Thread t = new Thread(() => myFun((j + 1))); 
     t.Start(); 
    } 
} 

private void myFun(int threadNo) 
{ 
    Console.WriteLine("Thread #" + threadNo.ToString()); 
} 

,並享受變化。

0

您既可以使用「本地」變量的循環中像傑西建議,或者你也可以使用參數化的開始(ParameterizedThreadStart):

public void Run() 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     Thread t = new Thread(myFun); 
     t.Start(i + 1); 
    } 
} 

private void myFun(object threadNo) 
{ 
    Console.WriteLine("Thread #" + threadNo.ToString()); 
}