Я пытался использовать семафор для контроля количества запросов, которые может обработать моя служба. т.е.
class Service : IDisposable {
SemaphoreSlim s = new SemaphoreSlim(InitialCapacity);
....
async void ProcessRequest() {
await s.WaitAsync();
try {
......
} finally {
s.Release();
}
}
}
У меня есть 2 проблемы, которые я не знаю, как решить. Я использовал подобные хаки для решения этих проблем, но мне интересно, есть ли лучший способ
Я хочу иметь возможность динамически изменять мощность своего класса обслуживания, поэтому у меня есть что-то вроде этого.
void ChangeCapacity(int newCapacity) { int extraRequestsCount = newCapacity - oldCapacity; if (extraRequestsCount > 0) { s.Release(extraRequestsCount); } else if (extraRequestsCount < 0) { for (int i = 0; i < -extraRequestsCount; i++) { s.WaitAsync(); // try to steal some resources, over time... } } }
В методе dispose я хочу убедиться, что вся обработка запроса завершена, прежде чем я избавлюсь от семафора, иначе вызов s.Release() в моем ProcessRequest() вызовет ObjectDisposedException, поэтому я сделал следующее
public void Dispose() { if (s!= null) { for (int i = 0; i < oldCapacity; i++) { s.Wait(); } s.Dispose(); } }
Обратите внимание, что я много раз использовал цикл для ручного ожидания. Это очень медленно, если емкость большая. Есть лучший способ это сделать? Для семафора есть Release (int count), почему нет Wait (int count)?