我有一个Windows服务使用HttpWebRequest
调用REST Web服务,我使用BlockingCollection<T>
来实现Producer / Consumer模式。我的网络服务经常会返回502 Bad Gateway
或503 Service Unavailable
。
我95%肯定网络服务刚刚被淹没。因此,每当我得到其中一个回复时,我都想在客户端上限制请求。
我应该使用哪种类型的信号量? .Net 4 / 4.5类型还可以。这是我提出的解决方案的伪代码,消费者并行运行:
class Worker {
Semaphore _cooldown = new Semaphore();
void Run() {
StartProducersInParallel();
StartConsumersInParallel();
}
void Produce() {...}
void Consume() {
_cooldown.Wait(1000);
try {
var response = proxy.GetResponse();
} catch (ex) {
if (ex.Status == 502 || ex.Status == 503) {
_cooldown.Signal();
// ... wait here and then retry once
}
}
}
}
答案 0 :(得分:0)
Hans Passant的评论让我得到了这个解决方案:
class Worker {
ManualResetEventSlim _cooldown = new ManualResetEventSlim();
void Run() {
StartProducersInParallel();
StartConsumersInParallel();
}
void Produce() {...}
void Consume() {
_cooldown.Wait(1000);
var response;
try {
response = proxy.GetResponse();
_cooldown.Set();
} catch (ex) {
if (ex.Status == 502 || ex.Status == 503) {
_cooldown.Reset();
} else {
throw;
}
}
}
}
答案 1 :(得分:-1)
由于你有Consumer / Producer,你应该使用ReaderWriterLockSlim类,而不是Semaphore。 表示用于管理对资源的访问的锁,允许多个线程进行读取或独占访问以进行写入。