2014-10-30 53 views
2

我想通過局部變量獲得線程結果。如何通過局部變量獲取線程結果?

有代碼:

static void Main() 
{ 
    long res1 = 0, res2 = 0; 

    long n1 = 5000, n2 = 10000; 

    Thread t1 = new Thread(() => 
    { 
     res1 = Factorial(n1); 
    }); 

    Thread t2 = new Thread(() => { res2=Factorial(n2); }); 

    t1.Start(); 
    t2.Start(); 
    t1.Join(); 
    t2.Join(); 

    Console.WriteLine("Factorial of {0} equals {1}", n1, res1); 
    Console.WriteLine("Factorial of {0} equals {1}", n2, res2); 
} 

輸出:

Factorial of 5000 equals 0 
Factorial of 10000 equals 0 

爲什麼這段代碼返回0?

這是階乘函數:

static long Factorial(long n) 
{ 
    long res = 1; 
    do 
    { 
     res = res * n; 
    } while(--n > 0); 

    return res; 
} 
+1

隨着'Task'得到的結果是更容易。你不需要自己編組結果。 – usr 2014-10-30 12:19:04

回答

6

有與使用線程或變量捕捉的沒有問題。你Factorial方法簡單地返回0,因爲res = res * n迅速溢出,直到這些值都達到了:

long res = -9223372036854775808; 
long n = 4938; 

Console.WriteLine(res * n); 

你可以看到的結果是0,如果我們周圍的計算與checked我們會得到一個OverflowException

long res = -9223372036854775808; 
long n = 4938; 

checked 
{ 
    Console.WriteLine(res*n); 
} 

當然,如果res一次變爲0,任何進一步的乘法運算也會導致0。

我不知道你想計算一下,但你可能需要一個不同的(大)的數值數據類型(例如decimal

+1

一個有趣的bug。如果OP只是簡單地使用了調試器,就會被發現。 – usr 2014-10-30 12:18:39