using System.Collections.Concurrent;
using System.Threading.Tasks;
static async Task Main(string[] args)
ISimpleCalculatorWithCache calculator = new SimpleCalculatorWithCache();
calculator.Subtract(1, 2);
calculator.Multiply(1, 2);
var logFile = await calculator.DumpCacheToFile();
Console.WriteLine(logFile);
logFile = await calculator.DumpCacheToFile();
Console.WriteLine(logFile);
logFile = await calculator.DumpCacheToFile();
Console.WriteLine(logFile);
public class SimpleCalculatorWithCache : ISimpleCalculatorWithCache
public ConcurrentQueue<string> _queue { get; set; } = new ConcurrentQueue<string>();
public async Task<string> DumpCacheToFile()
var allItems = _queue.ToArray();
var fileName = Path.GetTempFileName();
File.WriteAllLinesAsync(fileName, allItems);
public double Add(double a, double b)
_queue.Enqueue($"Adding {a} and {b}");
public double Subtract(double a, double b)
_queue.Enqueue($"Subtracting {a} and {b}");
public double Multiply(double a, double b)
_queue.Enqueue($"Multiplying {a} and {b}");
public double Divide(double a, double b)
_queue.Enqueue($"Dividing {a} by {b}");
throw new DivideByZeroException("Divisor cannot be zero.");
public interface ISimpleCalculatorWithCache
Task<string> DumpCacheToFile();
double Add(double a, double b);
double Subtract(double a, double b);
double Multiply(double a, double b);
double Divide(double a, double b);