c# - 如何通过局部变量获取线程结果?

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

最佳答案

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

关于c# - 如何通过局部变量获取线程结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26651947/

相关文章:

java - 如何提高大文件的加密/解密性能

c# - 如何分析 Windows 服务(一种简单的方法)?

c# - 返回值表示无效值

.net - 如何根据 X509Certificate2Collection 链验证 X509Certificate2

c# - 什么类型的错误会导致程序慢慢使用更多的处理器能力并突然达到 100%?

c# - silverlight 中的自定义复选框

java - 我如何在java中删除球、改变颜色和改变球的类型

c# - 使用锁的正确位置在哪里

c# - 是否有与 nameof 等效的 XAML?

c# - Func<> 参数的变化