Example #1
0
        // Traditional version of calculation, without
        // and asynchronous programming
        public static void RunPiCalculation()
        {
            // Setup calculator and data objects
            PiCalcAlgorithm calc = new PiCalcAlgorithm();
            PiCalcData      data = new PiCalcData();

            // Run the main loop
            MainUILoop(calc, data);

            // Report result
            Console.WriteLine($"Final value for pi : {data.Pi}");
            Console.WriteLine($"Found after {data.Iterations} iterations");
        }
        // Asynchronous version of calculation
        public static async void RunPiCalculationAsync()
        {
            // Setup calculator and data objects
            PiCalcAlgorithm calc = new PiCalcAlgorithm();
            PiCalcData data = new PiCalcData();

            // This is where the magic happens...
            Task<double> task = calc.CalculateAsync(data);
            MainUILoopForAsync(data);
            double finalPi = await task;

            // Report result
            Console.WriteLine("Final value for pi : " + finalPi);
            Console.WriteLine("Found after " + data.Iterations + " iterations");
        }
Example #3
0
        // Main UI loop for the traditional version
        private static void MainUILoop(PiCalcAlgorithm calc, PiCalcData data)
        {
            // Keep doing this until the user quits.
            while (!data.Quit)
            {
                // Prompt user for input
                Console.Write("Enter p (pi value), d (do more iterations), i (iterations) or q (quit) : ");
                string userInput = Console.ReadLine();

                // Sanity check for input
                if (string.IsNullOrEmpty(userInput))
                {
                    continue;
                }

                // Process user input
                if (userInput.Equals("p")) // Pi value
                {
                    double diffPercent = Math.Abs((Math.PI - data.Pi) * 100.0 / Math.PI);
                    Console.WriteLine($"Current value for pi : {data.Pi} ({diffPercent} % diff.)");
                }
                else if (userInput.Equals("d"))   // Do more iterations
                {
                    Console.Write("Enter number of iterations to do : ");
                    string iterationsStr     = Console.ReadLine();
                    int    iterationsInSlice = 0;

                    if (Int32.TryParse(iterationsStr, out iterationsInSlice) && iterationsInSlice > 0)
                    {
                        double partialPi = calc.Calculate(iterationsInSlice);

                        Console.WriteLine($"Did {iterationsInSlice} additional iterations");
                        data.Pi          = (data.Pi * data.Iterations + partialPi * iterationsInSlice) / (data.Iterations + iterationsInSlice);
                        data.Iterations += iterationsInSlice;
                    }
                }
                else if (userInput.Equals("i"))   // Iterations so far
                {
                    Console.WriteLine($"Iterations so far : {data.Iterations}");
                }
                else if (userInput.Equals("q"))   // Quit
                {
                    data.Quit = true;
                }
            }
        }