From 35bbf66fb619b3f6c789239c7e5bf38eda978544 Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 18 Oct 2022 04:34:59 -0400 Subject: [PATCH] Move taskbar logic to a class. --- .../Helpers/Taskbar/TaskbarProgress.cs | 46 +++++++++++++++++++ .../Running/BenchmarkRunnerClean.cs | 30 +++--------- 2 files changed, 52 insertions(+), 24 deletions(-) create mode 100644 src/BenchmarkDotNet/Helpers/Taskbar/TaskbarProgress.cs diff --git a/src/BenchmarkDotNet/Helpers/Taskbar/TaskbarProgress.cs b/src/BenchmarkDotNet/Helpers/Taskbar/TaskbarProgress.cs new file mode 100644 index 0000000000..df4d29fa34 --- /dev/null +++ b/src/BenchmarkDotNet/Helpers/Taskbar/TaskbarProgress.cs @@ -0,0 +1,46 @@ +using Microsoft.WindowsAPICodePack.Taskbar; +using System; + +namespace BenchmarkDotNet.Helpers +{ + internal class TaskbarProgress : IDisposable + { + private IntPtr consoleWindowHandle = IntPtr.Zero; + + [System.Runtime.InteropServices.DllImport("kernel32.dll")] + private static extern IntPtr GetConsoleWindow(); + + internal TaskbarProgress() + { + if (TaskbarManager.IsPlatformSupported) + { + consoleWindowHandle = GetConsoleWindow(); + TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Normal, consoleWindowHandle); + Console.CancelKeyPress += OnConsoleCancelEvent; + } + } + + internal void SetProgress(int currentValue, int maximumValue) + { + if (consoleWindowHandle != IntPtr.Zero) + { + TaskbarManager.Instance.SetProgressValue(currentValue, maximumValue, consoleWindowHandle); + } + } + + private void OnConsoleCancelEvent(object sender, ConsoleCancelEventArgs e) + { + Dispose(); + } + + public void Dispose() + { + if (consoleWindowHandle != IntPtr.Zero) + { + TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.NoProgress, consoleWindowHandle); + consoleWindowHandle = IntPtr.Zero; + Console.CancelKeyPress -= OnConsoleCancelEvent; + } + } + } +} diff --git a/src/BenchmarkDotNet/Running/BenchmarkRunnerClean.cs b/src/BenchmarkDotNet/Running/BenchmarkRunnerClean.cs index 1693c3c1bd..0024eb1da0 100644 --- a/src/BenchmarkDotNet/Running/BenchmarkRunnerClean.cs +++ b/src/BenchmarkDotNet/Running/BenchmarkRunnerClean.cs @@ -22,7 +22,6 @@ using BenchmarkDotNet.Toolchains.Parameters; using BenchmarkDotNet.Toolchains.Results; using BenchmarkDotNet.Validators; -using Microsoft.WindowsAPICodePack.Taskbar; using Perfolizer.Horology; using RunMode = BenchmarkDotNet.Jobs.RunMode; @@ -34,13 +33,7 @@ internal static class BenchmarkRunnerClean internal static readonly IResolver DefaultResolver = new CompositeResolver(EnvironmentResolver.Instance, InfrastructureResolver.Instance); - private static IntPtr ConsoleWindowHandle; - private static ConsoleCancelEventHandler OnConsoleCancelEvent = delegate { - TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.NoProgress, ConsoleWindowHandle); - }; - - [System.Runtime.InteropServices.DllImport("kernel32.dll")] - private static extern IntPtr GetConsoleWindow(); + private static TaskbarProgress s_taskbarProgress; internal static Summary[] Run(BenchmarkRunInfo[] benchmarkRunInfos) { @@ -52,6 +45,9 @@ internal static Summary[] Run(BenchmarkRunInfo[] benchmarkRunInfos) var resultsFolderPath = GetResultsFolderPath(rootArtifactsFolderPath, benchmarkRunInfos); var logFilePath = Path.Combine(rootArtifactsFolderPath, title + ".log"); + using var taskbarProgress = new TaskbarProgress(); + s_taskbarProgress = taskbarProgress; + using (var streamLogger = new StreamLogger(GetLogFileStreamWriter(benchmarkRunInfos, logFilePath))) { var compositeLogger = CreateCompositeLogger(benchmarkRunInfos, streamLogger); @@ -138,8 +134,7 @@ internal static Summary[] Run(BenchmarkRunInfo[] benchmarkRunInfos) Cleanup(new HashSet(artifactsToCleanup.Distinct())); compositeLogger.Flush(); - Console.CancelKeyPress -= OnConsoleCancelEvent; - ConsoleWindowHandle = IntPtr.Zero; + s_taskbarProgress = null; } } } @@ -244,10 +239,6 @@ private static Summary Run(BenchmarkRunInfo benchmarkRunInfo, { Console.Title = consoleTitle; } - if (TaskbarManager.IsPlatformSupported) - { - TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.NoProgress, ConsoleWindowHandle); - } var runEnd = runsChronometer.GetElapsed(); @@ -657,12 +648,6 @@ private static void UpdateTitle(int totalBenchmarkCount, int benchmarksToRunCoun { Console.Title = $"{benchmarksToRunCount}/{totalBenchmarkCount} Remaining"; } - if (TaskbarManager.IsPlatformSupported) - { - ConsoleWindowHandle = GetConsoleWindow(); - TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Normal, ConsoleWindowHandle); - Console.CancelKeyPress += OnConsoleCancelEvent; - } } private static void LogProgress(ILogger logger, in StartedClock runsChronometer, int totalBenchmarkCount, int benchmarksToRunCount) @@ -678,10 +663,7 @@ private static void LogProgress(ILogger logger, in StartedClock runsChronometer, { Console.Title = $"{benchmarksToRunCount}/{totalBenchmarkCount} Remaining - {(int)fromNow.TotalHours}h {fromNow.Minutes}m to finish"; } - if (TaskbarManager.IsPlatformSupported) - { - TaskbarManager.Instance.SetProgressValue(executedBenchmarkCount, totalBenchmarkCount, ConsoleWindowHandle); - } + s_taskbarProgress.SetProgress(executedBenchmarkCount, totalBenchmarkCount); } private static TimeSpan GetEstimatedFinishTime(in StartedClock runsChronometer, int benchmarksToRunCount, int executedBenchmarkCount)