Ограничить нет. экземпляров в службе Windows - PullRequest
2 голосов
/ 24 июня 2011

Я пишу службу Windows, которая запускается таймером и отнимает много времени каждую минуту.Я хочу ограничить нет.количество экземпляров службы, запущенных за раз, скажет 100. Как я могу это сделать?Любая идея?

Отредактировано: я хочу ограничить нет.потоков, запущенных таймером.

Ответы [ 3 ]

1 голос
/ 24 июня 2011

Если вы используете System.Threading.ThreadPool, есть функция SetMaxThreads , которая позволяет вам контролировать максимальное количество одновременно работающих потоков.Также обратите внимание на замечания на этой странице об изменении количества одновременных потоков.

0 голосов
/ 24 июня 2011

Этот код демонстрирует, что вам нужно.

Просто используйте объект SemaphoreSlim (такой же, как семафор, лучшая производительность), чтобы сделать это.

Думайте о семафоре как о счетчике. Каждый раз, когда вы ждете, счетчик выключается на одну цифру. В конце операции нужно ее отпустить.

Когда счетчик равен 0, семафор не может быть получен.

Что касается предложений ThreadPool, я не думаю, что это хорошая идея, потому что пул потоков используется во многих частях вашего приложения, не только в этом.

class Program
    {
        private static SemaphoreSlim threadsSemaphore = new SemaphoreSlim(5, 5);

        static void Main(string[] args)
        {
            Timer timer = new Timer(DoSomeWork, null, 0, 100);

            Console.ReadKey();
        }

        private static void DoSomeWork(object state)
        {
            if (threadsSemaphore.Wait(TimeSpan.FromSeconds(1)))
            {
                try
                {
                    Console.WriteLine("Doing work ...");
                    Thread.Sleep(1000);
                }
                finally
                {
                    threadsSemaphore.Release();
                }
            }
            else
            {
                Console.WriteLine("Skipping work", threadsSemaphore.CurrentCount);
            }


        }
    }
0 голосов
/ 24 июня 2011

Звучит как очень плохой дизайн - и память / процессор. Я не уверен, что понимаю, что вы имеете в виду, когда говорите, что 100 служб Windows - это одна служба. По крайней мере, в смысле наличия уникального сервиса. Вы запускаете 100 приложений, запущенных в фоновом режиме через диспетчер задач? Если это так, вы можете сделать это намного приятнее, создав реальную службу Windows и имея логику в этой службе для управления потоком приложения (и выполнением нескольких экземпляров вашего кода).

Например, у вас может быть служба Windows с одним основным потоком, который будет спать для n. секунд, а затем выполнить. После пробуждения основного потока он будет отвечать за выделение новых потоков. Например, вы можете использовать пул потоков, тогда как вы можете контролировать количество активных потоков. Ваш основной поток проверит пул потоков, чтобы определить, достигнут ли он емкости, и, если он действителен, выделит новый поток.

Main Service Thread
 > Sleep n. seconds
   > ThreadPool < 100?
     > New Thread
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...