public static void Main(string[] args) { Console.WriteLine("######## Starting at " + DateTime.UtcNow); // supported scenarios: // -------------------- // 0: all // 1: start threads with specific callstacks in another appdomain // 2: start threads with generic type and method having long parameters list in callstack // 3: start threads that sleep/task.delay for 10s, 20s, 30s, 40s every minute // 4: start a thread to compute pi at a certain precision (high CPU usage) // 5: start n threads computing fibonacci // 6: start n threads sleeping // 7: start n threads doing async calls with CPU consumption along the way Console.WriteLine($"{Environment.NewLine}Usage:{Environment.NewLine} > {Process.GetCurrentProcess().ProcessName} [--service] [--iterations <number of iterations to execute>] [--scenario <0=all 1=computer 2=generics 3=wall time 4=pi computation>] [--timeout <duration in seconds> | --run-infinitely]"); Console.WriteLine(); EnvironmentInfo.PrintDescriptionToConsole(); ParseCommandLine(args, out TimeSpan timeout, out bool runAsService, out Scenario scenario, out int iterations, out int nbThreads); // This application is used for several purposes: // - execute a processing for a given duration (for smoke test) // - execute a processing several times (for runtime test) // - never stop (for reliability environment) // - as a service // - interactively for debugging var computerService = new ComputerService(); if (runAsService) { computerService.RunAsService(timeout, scenario); } else { // collect CLR metrics that will be saved into a json file // if SIGNALFX_PROFILING_METRICS_FILEPATH is set using (var collector = new MetricsCollector()) { if (iterations > 0) { Console.WriteLine($" ########### The application will run scenario {scenario} {iterations} times with {nbThreads} thread(s)."); computerService.Run(scenario, iterations, nbThreads); } else if (timeout == TimeSpan.MinValue) { Console.WriteLine($" ########### The application will run interactively because no timeout was specified or could be parsed. Number of Threads: {nbThreads}."); computerService.StartService(scenario, nbThreads); Console.WriteLine($"{Environment.NewLine} ########### Press enter to finish."); Console.ReadLine(); computerService.StopService(); Console.WriteLine($"{Environment.NewLine} ########### Press enter to terminate."); Console.ReadLine(); } else { Console.WriteLine($" ########### The application will run non-interactively for {timeout} and will stop after that time. Number of Threads: {nbThreads}."); computerService.StartService(scenario, nbThreads); Thread.Sleep(timeout); computerService.StopService(); } } Console.WriteLine($"{Environment.NewLine} ########### Finishing run at {DateTime.UtcNow}"); } }
public WindowsService(ComputerService service, TimeSpan timeout, Scenario scenario) { _computerService = service; _scenario = scenario; Task.Delay(timeout).ContinueWith(t => Stop()); }