From 013a95ee8dbacec80f01b2708f4308f1a1bda477 Mon Sep 17 00:00:00 2001 From: NextTurn <45985406+NextTurn@users.noreply.github.com> Date: Fri, 14 Feb 2020 00:00:00 +0800 Subject: [PATCH 1/3] Fix list enumeration --- .../commands/management/Service.cs | 23 ++++--------------- 1 file changed, 5 insertions(+), 18 deletions(-) diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs index 72473902466..3196546def4 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs @@ -1087,17 +1087,9 @@ internal List DoStopService(ServiceController serviceControll /// True if all dependent services are stopped /// False if not all dependent services are stopped /// - private bool HaveAllDependentServicesStopped(ICollection dependentServices) + private bool HaveAllDependentServicesStopped(ServiceController[] dependentServices) { - foreach (ServiceController service in dependentServices) - { - if (service.Status != ServiceControllerStatus.Stopped) - { - return false; - } - } - - return true; + return Array.TrueForAll(dependentServices, service => service.Status == ServiceControllerStatus.Stopped); } /// @@ -1106,14 +1098,9 @@ private bool HaveAllDependentServicesStopped(ICollection depe /// A list of services. internal void RemoveNotStoppedServices(List services) { - foreach (ServiceController service in services) - { - if (service.Status != ServiceControllerStatus.Stopped && - service.Status != ServiceControllerStatus.StopPending) - { - services.Remove(service); - } - } + services.RemoveAll(service => + service.Status != ServiceControllerStatus.Stopped && + service.Status != ServiceControllerStatus.StopPending); } /// From a8c9b5e375c3f6036342f9f00f3b973035f2e68f Mon Sep 17 00:00:00 2001 From: NextTurn <45985406+NextTurn@users.noreply.github.com> Date: Fri, 13 Mar 2020 00:00:00 +0800 Subject: [PATCH 2/3] Add a comment and a reference --- .../commands/management/Service.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs index 3196546def4..d405a63d4e0 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs @@ -1098,6 +1098,8 @@ private bool HaveAllDependentServicesStopped(ServiceController[] dependentServic /// A list of services. internal void RemoveNotStoppedServices(List services) { + // You shall not modify a collection during enumeration. + // https://stackoverflow.com/questions/1582285/how-to-remove-elements-from-a-generic-list-while-iterating-over-it services.RemoveAll(service => service.Status != ServiceControllerStatus.Stopped && service.Status != ServiceControllerStatus.StopPending); From 6c324ff7bc611fdf0cbdd8fc01c9d20cb05fabb4 Mon Sep 17 00:00:00 2001 From: NextTurn <45985406+NextTurn@users.noreply.github.com> Date: Sat, 14 Mar 2020 00:00:00 +0800 Subject: [PATCH 3/3] Remove the reference --- .../commands/management/Service.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs b/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs index d405a63d4e0..35d0204f412 100644 --- a/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs +++ b/src/Microsoft.PowerShell.Commands.Management/commands/management/Service.cs @@ -1099,7 +1099,6 @@ private bool HaveAllDependentServicesStopped(ServiceController[] dependentServic internal void RemoveNotStoppedServices(List services) { // You shall not modify a collection during enumeration. - // https://stackoverflow.com/questions/1582285/how-to-remove-elements-from-a-generic-list-while-iterating-over-it services.RemoveAll(service => service.Status != ServiceControllerStatus.Stopped && service.Status != ServiceControllerStatus.StopPending);