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;
}