public void TestDailyParallization()
        {
            //Energiemenge em ;
            //using (StreamReader r = new StreamReader(Directory.GetFiles("BusinessObjectExtensions/Energiemenge/completeness", "threeyears.json").First()))
            //{
            //    string jsonString = r.ReadToEnd();
            //    em = JsonConvert.DeserializeObject<Energiemenge>(jsonString);
            //}
            Energiemenge     em       = new Energiemenge();
            DateTime         dateTime = DateTime.Parse("2015-01-31 22:45:00");
            List <Verbrauch> listvb   = new List <Verbrauch>();

            for (int u = 0; u < 1500; u++)
            {
                dateTime = dateTime.AddMinutes(15);
                DateTime endDateTime = dateTime.AddMinutes(15);

                listvb.Add(new Verbrauch()
                {
                    Startdatum = dateTime, Enddatum = endDateTime, Einheit = Mengeneinheit.JAHR, Wert = 12
                });
                dateTime = endDateTime;
            }
            em.Energieverbrauch = listvb;

            MiniProfiler mpLinear = MiniProfiler.StartNew("Non-Parallel");

            em.GetMonthlyCompletenessReports(new TimeRange(new DateTime(2015, 1, 1, 23, 00, 0, DateTimeKind.Utc), new DateTime(2019, 12, 31, 23, 0, 0, DateTimeKind.Utc)), useParallelExecution: false);
            mpLinear.Stop();
            Console.Out.Write(mpLinear.RenderPlainText());
            //Assert.IsTrue(mpLinear.DurationMilliseconds < 4000, $"Linear completeness report generation was too slow. Expected less than 4 seconds but was {mpLinear.DurationMilliseconds}ms: {mpLinear.RenderPlainText()}");

            MiniProfiler mpParallel = MiniProfiler.StartNew("Parallel");

            em.GetDailyCompletenessReports(new TimeRange(new DateTime(2015, 1, 01, 23, 0, 0, DateTimeKind.Utc), new DateTime(2019, 12, 31, 23, 0, 0, DateTimeKind.Utc)), useParallelExecution: true);
            mpParallel.Stop();
            Console.Out.Write(mpParallel.RenderPlainText());
            //Assert.IsTrue(mpParallel.DurationMilliseconds < 3000, $"Parallel completeness report generation was too slow. Expected less than 3 seconds but was {mpParallel.DurationMilliseconds}ms: {mpParallel.RenderPlainText()}");
            //Assert.IsTrue(mpParallel.DurationMilliseconds < (int)mpLinear.DurationMilliseconds * 1.25M, $"Parallel: {mpParallel.DurationMilliseconds}, Non-Parallel: {mpLinear.DurationMilliseconds}");
        }
 internal void TestMonthlySlices(bool testFirstOnly = true, bool useParallelExecution = false)
 {
     foreach (string boFile in Directory.GetFiles("Energiemenge/completeness", "50hz_prognose*.json"))
     {
         using (MiniProfiler.Current.Step($"Processing file {boFile} with parallel={useParallelExecution}"))
         {
             JObject json;
             using (StreamReader r = new StreamReader(boFile))
             {
                 string jsonString = r.ReadToEnd();
                 json = JsonConvert.DeserializeObject <JObject>(jsonString);
             }
             Energiemenge em     = BoMapper.MapObject <Energiemenge>(json, LenientParsing.Strict);
             var          result = em.GetMonthlyCompletenessReports(GERMAN_YEAR_2018, useParallelExecution: useParallelExecution);
             Assert.AreEqual(12, result.Count); // don't care about values of coverage, just the start/end and count of reports generated.
             if (testFirstOnly)
             {
                 break; // one test is enough. the rest is covered by the individual completeness report tests
             }
         }
     }
 }