Семафор динамического изменения размера C # - PullRequest
3 голосов
/ 09 апреля 2011

Я пытаюсь использовать семафоры, чтобы контролировать, сколько экземпляров задания может быть запущено одновременно.Хотя это довольно просто при использовании метода ожидания, я также хочу, чтобы значение можно было настраивать во время выполнения, чтобы можно было увеличивать или уменьшать счет.

Я понимаю, что могут быть проблемы, снижающие счет, но есть ли способ сделать это на самом деле?Это правильный подход к использованию семафоров?

Ответы [ 2 ]

2 голосов
/ 09 апреля 2011

Согласно документации ReleaseSemaphore , для параметра lReleaseCount:

Величина, на которую увеличивается текущее число объектов семафора. Значение должно быть больше нуля. Если указанное количество приведет к тому, что счетчик семафора превысит максимальный счет, который был указан при создании семафора, счетчик не изменится, и функция вернет FALSE.

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

Вам нужно найти другой способ управления лимитом в этом сценарии.

Один из способов, которыми вы могли бы использовать семафор, было бы выделить семафор, достаточно большой для всех будущих потребностей, а затем просто взять достаточно «экземпляров» его для Доступный номер вернитесь к тому, что вам нужно на данный момент. Если вы хотите увеличить количество доступных экземпляров, просто отпустите те, которые вы захватили в начале.

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

1 голос
/ 09 апреля 2011

Хотя это довольно просто при использовании метода ожидания, я также хочу, чтобы значение можно было настраивать во время выполнения, чтобы можно было увеличивать или уменьшать счет.

Я бы не рекомендовал использовать для этого семафоры.

Если вы находитесь в .NET 4, мой предложенный метод будет состоять в том, чтобы создать пользовательский TaskScheduler , который позволит вам изменять уровень параллелизма во время выполнения. Затем можно выполнить всю операцию, используя один вызов Parallel.For / ForEach, передавая этот TaskScheduler в параметрах, и изменить уровень параллелизма во время выполнения.

Это позволит довольно легко обрабатывать движущиеся уровни вверх или вниз. Когда уровни повышаются, вы просто добавляете новые темы по мере необходимости. Когда они выйдут из строя, просто удалите этот поток из вашей внутренней коллекции (но не останавливайте его) и дайте ему закончить свою текущую работу. Это позволит вам масштабировать по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...