Остановить все Windows службы, не содержащихся в списке

255
27 июня 2017, 21:22

Останавливаю службы из списка List<string> таким способом:

namespace ConsoleApplication25 {
    class Program {
        static List<string> services = new List<string> {
            "AdobeARMService", "RemoteRegistry", "TermService", "Messenger", "SSDPSRV"
        };
        static void Main(string[] args) {
            Task.Factory.StartNew(() => Run());
            Console.ReadLine();
        }
        static void Run() {
            while (true) {
                var temp = ServiceController.GetServices().Where(s => services.Contains(s.ServiceName)).ToList();
                temp.ForEach(t => {
                    try {
                        t.Stop();
                    }
                    catch { }
                });
                Thread.Sleep(500);
            }
        }
    }
}

А как сделать обход служб в List<string> services ? чтобы их не останавливал, а все остальные службы которых нету в списке остановить.

Answer 1

Очень опасно останавливать все службы... Но хозяин барин...

public async Task<bool> StopAllServicesExcept(params string[] exceptServices)
{
    var servicesToStop = ServiceController.GetServices().Where(s => !exceptServices.Contains(s.ServiceName));
    var tasks = servicesToStop.Select(s => Task.Run(() =>
    {
        try
        {
            s.Stop();
            s.WaitForStatus(ServiceControllerStatus.Stopped, TimeSpan.FromMinutes(1));
            return true;
        }
        catch (Exception)
        {
            return false;
        }
    })).ToList();
    await Task.WhenAll(tasks);
    return tasks.All(t => t.Result);
}

Что тут происходит:

  • Берем все сервисы и вычеркиваем из списка все, которые останавливать не надо.
  • Создаем кучу тасков, которые стопают сервисы (поставил таймаут 1 мин, если за это время не стопнулся сервис - скорее всего что-то пошло не так и смысла ждать нет, по видимому...). Они возвращают true в случае успешного стопа, иначе - false.
  • Ждем выполнения всех тасков.
  • Возвращаем true, если все сервисы стопнулись успешно, иначе - false.

Вызывать из асинхронной функции просто:

var allServicesStopped = await StopAllServicesExcept("Service1", "Service2");

Если вызывать из Main:

var task = StopAllServicesExcept("Service1", "Service2");
task.Wait();
var allServicesStopped = task.Result;
READ ALSO
Сортировка текста в тхт файле по алфавиту

Сортировка текста в тхт файле по алфавиту

В тхт файле есть строки типа :

323
Сценарий обработки запросов в Telegram Bot c#

Сценарий обработки запросов в Telegram Bot c#

Как в Telegram bot обрабатывать команды?

239
Произведение матриц [требует правки]

Произведение матриц [требует правки]

Не могу решить умножение матриц через форму, то есть надо задать размер двух матриц так же через форму, умножить и вывести на экран

189