Example showing the result cache feature of the Pipeline API.If you want to know more about how result caching works, a complete explanation can be found in the documentation.
This example is available in full on GitHub.
The example shows how to:
- Add a cache to an engine:
 
primeEngine = new PrimeCheckerEngineBuilder()
    .SetCache(new CacheConfiguration())
    .Build();
- Demonstrate that subsequent calls to the engine that pass the same evidence will not go through the engine's Process method:
 
==========================================
Test without a cache
813565824 is not prime
Processing took 79.64ms
813565824 is not prime
Processing took 54.77ms
==========================================
Test with a cache
1391949351 is not prime
Processing took 78.01ms
1391949351 is not prime
Processing took 1.08ms
==========================================
/* *********************************************************************
 * This Original Work is copyright of 51 Degrees Mobile Experts Limited.
 * Copyright 2025 51 Degrees Mobile Experts Limited, Davidson House,
 * Forbury Square, Reading, Berkshire, United Kingdom RG1 3EU.
 *
 * This Original Work is licensed under the European Union Public Licence
 * (EUPL) v.1.2 and is subject to its terms as set out below.
 *
 * If a copy of the EUPL was not distributed with this file, You can obtain
 * one at https://opensource.org/licenses/EUPL-1.2.
 *
 * The 'Compatible Licences' set out in the Appendix to the EUPL (as may be
 * amended by the European Commission) shall be deemed incompatible for
 * the purposes of the Work and the provisions of the compatibility
 * clause in Article 5 of the EUPL shall not apply.
 *
 * If using the Work as, or as part of, a network application, by
 * including the attribution notice(s) required under Article 5 of the EUPL
 * in the end user terms of the application under an appropriate heading,
 * such notice(s) shall fulfill the requirements of that article.
 * ********************************************************************* */
using Microsoft.Extensions.Logging;
using System;
using System.Diagnostics;
namespace Examples.ResultCaching
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var instance = new Program();
            instance.RunExample();
            Console.WriteLine("==========================================");
            Console.WriteLine("Example complete. Press any key to exit.");
            // Wait for user to press a key.
            Console.ReadKey();
        }
        {
            Console.WriteLine("==========================================");
            Console.WriteLine("Test without a cache");
            // Create a new 'prime checker' engine. 
            var primeEngine = new PrimeCheckerEngineBuilder()
                .Build();
            // Run the example using the engine
            Run(primeEngine);
            Console.WriteLine("==========================================");
            Console.WriteLine("Test with a cache");
            // Create a new 'prime checker' engine.
            primeEngine = new PrimeCheckerEngineBuilder()
                // Add a cache with the default configuration
                .SetCache(new CacheConfiguration())
                .Build();
            // Run the example using the engine with a cache
            Run(primeEngine);
            Console.WriteLine("==========================================");
            Console.WriteLine($"This engine contains a " +
                $"{Constants.PRIMECHECKER_ENGINE_DELAY}ms delay to simulate " +
                $"complex processing. The first test above does not use " +
                $"a cache so both process calls take at least that long. " +
                $"In the second test, a cache is added, This means that on the " +
                $"second call to process the same number, the engine already " +
                $"has the result in it's cache due to the first call and can " +
                $"return that result much more quickly as it avoids the " +
                $"{Constants.PRIMECHECKER_ENGINE_DELAY}ms delay.");
        }
        private void Run(PrimeCheckerEngine primeEngine)
        {
            // Create a new pipeline using the prime checker engine
            // that was passed in
            using (var pipeline = new PipelineBuilder(new LoggerFactory())
                .AddFlowElement(primeEngine)
                .Build())
            {
                Random rnd = new Random();
                // Get a random integer
                int value = rnd.Next();
                // Determine if the value is prime or not.
                Process(value, pipeline);
                // Repeat the process with the same value.
                Process(value, pipeline);
            }
        }
        private void Process(int value, IPipeline pipeline)
        {
            bool prime = false;
            // Create a new flow data instance.
            using (var data = pipeline.CreateFlowData())
            {
                // Set the specified value as the input evidence.
                data.AddEvidence(Constants.PRIMECHECKER_EVIDENCE_KEY, value);
                // Start timer to measure processing time
                Stopwatch timer = new Stopwatch();
                timer.Start();
                // Process the evidence.
                data.Process();
                // Stop timer
                timer.Stop();
                // Read the result back from the flow data.
                prime = data.Get<IPrimeCheckerData>().IsPrime ?? false;
                // Output a message displaying the number and whether 
                // it is prime or not along with the time taken.
                Console.WriteLine($"{value} {(prime ? "is" : "is not")} prime");
                Console.WriteLine($"Processing took " +
                    $"{timer.Elapsed.TotalMilliseconds.ToString("N2")}ms");
            }
        }
    }
}
