diff --git a/Creek.HelpfulExtensions/Creek.HelpfulExtensions.csproj b/Creek.HelpfulExtensions/Creek.HelpfulExtensions.csproj
index 51bdcc6..27738a1 100644
--- a/Creek.HelpfulExtensions/Creek.HelpfulExtensions.csproj
+++ b/Creek.HelpfulExtensions/Creek.HelpfulExtensions.csproj
@@ -19,11 +19,12 @@
LICENSE
git
creek
- 1.3.0
- 1.3.0.0
+ 1.4.0
+ 1.4.0.0
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/Creek.HelpfulExtensions/DisposableStopWatchExtension.cs b/Creek.HelpfulExtensions/DisposableStopWatchExtension.cs
new file mode 100644
index 0000000..242af01
--- /dev/null
+++ b/Creek.HelpfulExtensions/DisposableStopWatchExtension.cs
@@ -0,0 +1,58 @@
+using System;
+using System.Diagnostics;
+using Microsoft.Extensions.Logging;
+
+namespace Creek.HelpfulExtensions
+{
+ public class DisposableStopWatch : IDisposable
+ {
+ private ILogger _logger;
+ private Stopwatch _stopWatch;
+ private string _message;
+ private bool _useConsole;
+
+ public DisposableStopWatch(ILogger logger, string message = null, bool useConsole = false)
+ {
+ _logger = logger;
+ _stopWatch = new Stopwatch();
+ _message = message ?? string.Empty;
+ _useConsole = useConsole;
+
+ string startMessage = $"Start: {message}";
+
+ if (_useConsole)
+ {
+ _logger.LogInformation(startMessage);
+ Console.WriteLine(startMessage);
+ }
+ else
+ {
+ _logger.LogInformation(startMessage);
+ }
+
+ _stopWatch.Start();
+ }
+
+ public void Dispose()
+ {
+ _stopWatch.Stop();
+
+ string endMessage = $"Complete:{_message}: Elapsed: {_stopWatch.Elapsed}";
+
+ if (_useConsole)
+ {
+ _logger.LogInformation(endMessage);
+ Console.WriteLine(endMessage);
+ }
+ else
+ {
+ _logger.LogInformation(endMessage);
+ }
+ }
+ }
+
+ public static class DisposableStopWatchExtension
+ {
+ public static DisposableStopWatch DisposableStopWatch(this ILogger logger, string msg = null) => new DisposableStopWatch(logger, msg);
+ }
+}