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

本文关键字:线程 结果 何通过 局部变量 | 更新日期: 2023-09-27 18:28:29

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

有一个代码:

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; 
} 

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

使用线程或变量捕获没有问题。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