From f91aecad8efe00a5efbdda7ffba8ad470bb939fc Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Mon, 29 Mar 2021 09:35:39 -0700 Subject: [PATCH] Add queueing mechanism to DumpEnvironment --- MPF.Library/Utilities/DumpEnvironment.cs | 39 ++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/MPF.Library/Utilities/DumpEnvironment.cs b/MPF.Library/Utilities/DumpEnvironment.cs index 15ea49a6..ba70d826 100644 --- a/MPF.Library/Utilities/DumpEnvironment.cs +++ b/MPF.Library/Utilities/DumpEnvironment.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; using System.IO; @@ -70,12 +71,36 @@ namespace MPF.Utilities /// String value to report public EventHandler ReportStatus; + /// + /// Queue of items that need to be logged + /// + private readonly ConcurrentQueue outputQueue = new ConcurrentQueue(); + /// /// Event handler for data returned from a process /// private void OutputToLog(object proc, string args) { - ReportStatus.Invoke(this, args); + outputQueue.Enqueue(args); + } + + /// + /// Process the outputs in the queue + /// + private void ProcessOutputs() + { + while (true) + { + // Nothing in the queue means we get to idle + if (outputQueue.Count == 0) + continue; + + // Get the next item from the queue + if (!outputQueue.TryDequeue(out string nextOutput)) + continue; + + ReportStatus.Invoke(this, nextOutput); + } } #endregion @@ -368,10 +393,16 @@ namespace MPF.Utilities if (!result) return result; + // Invoke output processing, if needed + if (!Options.ToolsInSeparateWindow) + { + Task.Run(() => ProcessOutputs()); + Parameters.ReportStatus += OutputToLog; + } + // Execute internal tool progress?.Report(Result.Success($"Executing {Options.InternalProgram}... {(Options.ToolsInSeparateWindow ? "please wait!" : "see log for output!")}")); Directory.CreateDirectory(OutputDirectory); - Parameters.ReportStatus += OutputToLog; await Task.Run(() => Parameters.ExecuteInternalProgram(Options.ToolsInSeparateWindow)); progress?.Report(Result.Success($"{Options.InternalProgram} has finished!")); @@ -380,6 +411,10 @@ namespace MPF.Utilities result = await Task.Run(() => ExecuteAdditionalTools()); progress?.Report(result); + // Remove evet habdler if needed + if (!Options.ToolsInSeparateWindow) + Parameters.ReportStatus -= OutputToLog; + return result; }