ฉันพยายามใช้เซมาฟอร์เพื่อควบคุมจำนวนคำขอที่บริการของฉันสามารถรองรับได้ เช่น.
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... } } }
ที่วิธีการกำจัด ฉันต้องการให้แน่ใจว่าการประมวลผลคำขอทั้งหมดเสร็จสมบูรณ์ก่อนที่ฉันจะกำจัดเซมาฟอร์ ไม่เช่นนั้นการเรียก 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)?