C# 析因使用任务

C# 析因使用任务,c#,C#,我正在寻找一种使用task计算数字阶乘的方法。我的目的是使用顺序循环将结果与阶乘进行比较。例如 16! task1=16*15*14*13*12*11,task2=10*9*8*7*6,task3=5*4*3*2*1 我在网上搜索过,但找不到符合我需要的解决方案。谢谢你的期待 static long factorialmethod(int number) { long factorial; factorial = number;

我正在寻找一种使用task计算数字阶乘的方法。我的目的是使用顺序循环将结果与阶乘进行比较。例如 16! task1=16*15*14*13*12*11,task2=10*9*8*7*6,task3=5*4*3*2*1 我在网上搜索过,但找不到符合我需要的解决方案。谢谢你的期待

static long factorialmethod(int number)
         {
            long factorial;
            factorial = number;
            if (number <= 1) { return 1; }
            else
            for (int i = number-1; i >= number; i--)
            {
                factorial *= i;
            }
        return factorial;
           }
      static void Main(string[] args)
         {
        int number;
        Console.WriteLine("Please input your whole number");
        number = int.Parse(Console.ReadLine());
        Console.WriteLine("\nFactorial of the number is {0}",factorialmethod(number));
        Console.ReadKey()
         }

计算阶乘时尝试并行的最简单方法是PLinq parallel Linq:


使用秒表进行基准测试;AsParallel:你真的想要并行实现吗?更别说任务了?

如果你想走正路,你可以使用@DmitryBychenko-answer。但作为替代方案,您也可以直接使用并行库。如果你真的想用任务库解决你所说的问题,我认为PLINQ是一个更干净的解决方案,但是如果你把贴出的问题作为一个类似问题的简化版本,你需要更多的控制,那么下面的解决方案可能会有所帮助

static long Factorial(int number) {
    if (number < 1)
        return 1;

    var results = new ConcurrentBag<long>();
    Parallel.ForEach(Partitioner.Create(1, number + 1, 5 /*You can select your range size here. You can also derive it based on Environment.ProcessorCount, if you so wish */),
        (range, loopState) => {
            long product = 1;
            for (int i = range.Item1; i < range.Item2; i++) {
                product *= i;
            }
            results.Add(product);
        });

    long factorial = 1;
    foreach (var item in results)
        factorial *= item;
    return factorial;
}

为什么要使用任务?正如你的例子所示,你可以从基础开始。我建议你读一下:然后你知道从哪里开始。是的。我想要并行实现。将任意给定的数字划分为三个段并并行运行。我想将结果与上面代码中所示的正常阶乘计算进行比较。非常感谢。
static long Factorial(int number) {
    if (number < 1)
        return 1;

    var results = new ConcurrentBag<long>();
    Parallel.ForEach(Partitioner.Create(1, number + 1, 5 /*You can select your range size here. You can also derive it based on Environment.ProcessorCount, if you so wish */),
        (range, loopState) => {
            long product = 1;
            for (int i = range.Item1; i < range.Item2; i++) {
                product *= i;
            }
            results.Add(product);
        });

    long factorial = 1;
    foreach (var item in results)
        factorial *= item;
    return factorial;
}