如何通过局部变量获得线程结果?

时间:2014-10-30 11:36:44

标签: c# .net multithreading lambda task-parallel-library

我试图通过局部变量获得线程结果。

有代码:

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 个答案:

答案 0 :(得分: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