Fixed more threading issues in PowerShell cmdlets to ensure WriteObject and WriteError are only called from the main thread

This commit is contained in:
GraceSolutions
2025-04-15 12:53:47 -04:00
parent 68fcec516e
commit 29b83fbf16
6 changed files with 216 additions and 156 deletions
@@ -33,29 +33,36 @@ namespace PSOPNSenseAPI.Cmdlets
/// <summary> /// <summary>
/// Processes the cmdlet /// Processes the cmdlet
/// </summary> /// </summary>
protected override void ProcessRecord() protected override void ProcessRecordInternal()
{
try
{ {
var dnsService = new DNSService(ApiClient, Logger); var dnsService = new DNSService(ApiClient, Logger);
if (ParameterSetName == "ByUuid") if (ParameterSetName == "ByUuid")
{ {
var task = Task.Run(async () => await dnsService.GetDNSForwardingHostAsync(Uuid)); // Use our safe execution method
var result = task.GetAwaiter().GetResult(); var result = ExecuteAsyncTask(() => dnsService.GetDNSForwardingHostAsync(Uuid));
// Only continue if no exception occurred
if (ProcessingException != null || result == null)
{
return;
}
WriteObject(result.Host); WriteObject(result.Host);
} }
else else
{ {
var task = Task.Run(async () => await dnsService.GetDNSForwardingHostsAsync()); // Use our safe execution method
var result = task.GetAwaiter().GetResult(); var result = ExecuteAsyncTask(() => dnsService.GetDNSForwardingHostsAsync());
// Only continue if no exception occurred
if (ProcessingException != null || result == null)
{
return;
}
WriteObject(result.Rows, true); WriteObject(result.Rows, true);
} }
} }
catch (Exception ex)
{
HandleException(ex);
}
}
} }
} }
@@ -33,29 +33,36 @@ namespace PSOPNSenseAPI.Cmdlets
/// <summary> /// <summary>
/// Processes the cmdlet /// Processes the cmdlet
/// </summary> /// </summary>
protected override void ProcessRecord() protected override void ProcessRecordInternal()
{
try
{ {
var dnsService = new DNSService(ApiClient, Logger); var dnsService = new DNSService(ApiClient, Logger);
if (ParameterSetName == "ByUuid") if (ParameterSetName == "ByUuid")
{ {
var task = Task.Run(async () => await dnsService.GetDNSOverrideAsync(Uuid)); // Use our safe execution method
var result = task.GetAwaiter().GetResult(); var result = ExecuteAsyncTask(() => dnsService.GetDNSOverrideAsync(Uuid));
// Only continue if no exception occurred
if (ProcessingException != null || result == null)
{
return;
}
WriteObject(result.Host); WriteObject(result.Host);
} }
else else
{ {
var task = Task.Run(async () => await dnsService.GetDNSOverridesAsync()); // Use our safe execution method
var result = task.GetAwaiter().GetResult(); var result = ExecuteAsyncTask(() => dnsService.GetDNSOverridesAsync());
// Only continue if no exception occurred
if (ProcessingException != null || result == null)
{
return;
}
WriteObject(result.Rows, true); WriteObject(result.Rows, true);
} }
} }
catch (Exception ex)
{
HandleException(ex);
}
}
} }
} }
@@ -55,41 +55,73 @@ namespace PSOPNSenseAPI.Cmdlets
/// <summary> /// <summary>
/// Processes the cmdlet /// Processes the cmdlet
/// </summary> /// </summary>
protected override void ProcessRecord() protected override void ProcessRecordInternal()
{
try
{ {
var firmwareService = new FirmwareService(ApiClient, Logger); var firmwareService = new FirmwareService(ApiClient, Logger);
switch (ParameterSetName) switch (ParameterSetName)
{ {
case "Changelog": case "Changelog":
var changelogTask = Task.Run(async () => await firmwareService.GetChangelogAsync()); // Use our safe execution method
var changelogResult = changelogTask.GetAwaiter().GetResult(); var changelogResult = ExecuteAsyncTask(() => firmwareService.GetChangelogAsync());
// Only continue if no exception occurred
if (ProcessingException != null || changelogResult == null)
{
return;
}
WriteObject(changelogResult.Changelog); WriteObject(changelogResult.Changelog);
break; break;
case "Audit": case "Audit":
var auditTask = Task.Run(async () => await firmwareService.GetAuditAsync()); // Use our safe execution method
var auditResult = auditTask.GetAwaiter().GetResult(); var auditResult = ExecuteAsyncTask(() => firmwareService.GetAuditAsync());
// Only continue if no exception occurred
if (ProcessingException != null || auditResult == null)
{
return;
}
WriteObject(auditResult.Audit, true); WriteObject(auditResult.Audit, true);
break; break;
case "Health": case "Health":
var healthTask = Task.Run(async () => await firmwareService.GetHealthAsync()); // Use our safe execution method
var healthResult = healthTask.GetAwaiter().GetResult(); var healthResult = ExecuteAsyncTask(() => firmwareService.GetHealthAsync());
// Only continue if no exception occurred
if (ProcessingException != null || healthResult == null)
{
return;
}
WriteObject(healthResult.Health); WriteObject(healthResult.Health);
break; break;
case "Check": case "Check":
var checkTask = Task.Run(async () => await firmwareService.CheckForUpdatesAsync()); // Use our safe execution method
var checkResult = checkTask.GetAwaiter().GetResult(); var checkResult = ExecuteAsyncTask(() => firmwareService.CheckForUpdatesAsync());
// Only continue if no exception occurred
if (ProcessingException != null || checkResult == null)
{
return;
}
WriteObject($"Check for updates: {checkResult.Status}"); WriteObject($"Check for updates: {checkResult.Status}");
break; break;
default: default:
var statusTask = Task.Run(async () => await firmwareService.GetStatusAsync()); // Use our safe execution method
var statusResult = statusTask.GetAwaiter().GetResult(); var statusResult = ExecuteAsyncTask(() => firmwareService.GetStatusAsync());
// Only continue if no exception occurred
if (ProcessingException != null || statusResult == null)
{
return;
}
var firmware = new PSObject(); var firmware = new PSObject();
firmware.Properties.Add(new PSNoteProperty("Status", statusResult.Status)); firmware.Properties.Add(new PSNoteProperty("Status", statusResult.Status));
@@ -103,10 +135,5 @@ namespace PSOPNSenseAPI.Cmdlets
break; break;
} }
} }
catch (Exception ex)
{
HandleException(ex);
}
}
} }
} }
@@ -39,27 +39,44 @@ namespace PSOPNSenseAPI.Cmdlets
/// <summary> /// <summary>
/// Processes the cmdlet /// Processes the cmdlet
/// </summary> /// </summary>
protected override void ProcessRecord() protected override void ProcessRecordInternal()
{
try
{ {
var gatewayService = new GatewayService(ApiClient, Logger); var gatewayService = new GatewayService(ApiClient, Logger);
if (ParameterSetName == "ByUuid") if (ParameterSetName == "ByUuid")
{ {
var task = Task.Run(async () => await gatewayService.GetGatewayAsync(Uuid)); // Use our safe execution method
var result = task.GetAwaiter().GetResult(); var result = ExecuteAsyncTask(() => gatewayService.GetGatewayAsync(Uuid));
// Only continue if no exception occurred
if (ProcessingException != null || result == null)
{
return;
}
WriteObject(result.Gateway); WriteObject(result.Gateway);
} }
else else
{ {
var task = Task.Run(async () => await gatewayService.GetGatewaysAsync()); // Use our safe execution method
var result = task.GetAwaiter().GetResult(); var result = ExecuteAsyncTask(() => gatewayService.GetGatewaysAsync());
// Only continue if no exception occurred
if (ProcessingException != null || result == null)
{
return;
}
if (IncludeStatus.IsPresent) if (IncludeStatus.IsPresent)
{ {
var statusTask = Task.Run(async () => await gatewayService.GetGatewayStatusAsync()); // Use our safe execution method
var statusResult = statusTask.GetAwaiter().GetResult(); var statusResult = ExecuteAsyncTask(() => gatewayService.GetGatewayStatusAsync());
// Only continue if no exception occurred
if (ProcessingException != null || statusResult == null)
{
return;
}
foreach (var gateway in result.Rows) foreach (var gateway in result.Rows)
{ {
@@ -98,10 +115,5 @@ namespace PSOPNSenseAPI.Cmdlets
} }
} }
} }
catch (Exception ex)
{
HandleException(ex);
}
}
} }
} }
@@ -33,29 +33,36 @@ namespace PSOPNSenseAPI.Cmdlets
/// <summary> /// <summary>
/// Processes the cmdlet /// Processes the cmdlet
/// </summary> /// </summary>
protected override void ProcessRecord() protected override void ProcessRecordInternal()
{
try
{ {
var routeService = new RouteService(ApiClient, Logger); var routeService = new RouteService(ApiClient, Logger);
if (ParameterSetName == "ByUuid") if (ParameterSetName == "ByUuid")
{ {
var task = Task.Run(async () => await routeService.GetRouteAsync(Uuid)); // Use our safe execution method
var result = task.GetAwaiter().GetResult(); var result = ExecuteAsyncTask(() => routeService.GetRouteAsync(Uuid));
// Only continue if no exception occurred
if (ProcessingException != null || result == null)
{
return;
}
WriteObject(result.Route); WriteObject(result.Route);
} }
else else
{ {
var task = Task.Run(async () => await routeService.GetRoutesAsync()); // Use our safe execution method
var result = task.GetAwaiter().GetResult(); var result = ExecuteAsyncTask(() => routeService.GetRoutesAsync());
// Only continue if no exception occurred
if (ProcessingException != null || result == null)
{
return;
}
WriteObject(result.Rows, true); WriteObject(result.Rows, true);
} }
} }
catch (Exception ex)
{
HandleException(ex);
}
}
} }
} }
+1 -1
View File
@@ -3,7 +3,7 @@
RootModule = 'lib\PSOPNSenseAPI.dll' RootModule = 'lib\PSOPNSenseAPI.dll'
# Version number of this module. # Version number of this module.
ModuleVersion = '2025.04.15.1249' ModuleVersion = '2025.04.15.1253'
# Supported PSEditions # Supported PSEditions
CompatiblePSEditions = @('Desktop', 'Core') CompatiblePSEditions = @('Desktop', 'Core')