Saya telah mencoba menggunakan Semaphore untuk mengontrol jumlah permintaan yang dapat ditangani oleh layanan saya. YAITU.
class Service : IDisposable {
SemaphoreSlim s = new SemaphoreSlim(InitialCapacity);
....
async void ProcessRequest() {
await s.WaitAsync();
try {
......
} finally {
s.Release();
}
}
}
Ada 2 masalah yang saya temui yang saya tidak yakin bagaimana menyelesaikannya. Saya telah menggunakan peretasan serupa untuk menyelesaikan masalah ini, tetapi saya ingin tahu apakah ada cara yang lebih baik
Saya ingin dapat mengubah kapasitas kelas layanan saya secara dinamis, jadi saya punya sesuatu seperti ini.
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... } } }
Pada metode buang, saya ingin memastikan semua pemrosesan permintaan selesai sebelum saya membuang semaphore, jika tidak, panggilan s.Release() di ProcessRequest() saya akan memunculkan ObjectDisposeException jadi saya melakukan hal berikut
public void Dispose() { if (s!= null) { for (int i = 0; i < oldCapacity; i++) { s.Wait(); } s.Dispose(); } }
Perhatikan bahwa saya telah menggunakan loop untuk menunggu secara manual berkali-kali. Ini sangat lambat jika kapasitasnya besar. Apakah ada cara yang lebih baik untuk melakukan ini? Ada Rilis(int count) untuk semaphore mengapa tidak ada Wait(int count)?