.net 客户端HttpWebRequest节流应该使用哪种信号量类型? 背景

.net 客户端HttpWebRequest节流应该使用哪种信号量类型? 背景,.net,multithreading,http,.net,Multithreading,Http,我有一个windows服务使用HttpWebRequest调用REST web服务,我正在使用BlockingCollection实现生产者/消费者模式。我的web服务经常返回502坏网关或503服务不可用 我有95%的把握网络服务正在被淹没。因此,每当我得到这些响应中的一个时,我都希望限制客户端的请求 问题: 我应该使用哪种类型的信号灯。NET4/4.5类型可以。以下是我建议的解决方案的psuedocode,消费者是并行运行的: 类工作者{ 信号灯冷却时间=新信号灯(); 无效运行(){ St

我有一个windows服务使用
HttpWebRequest
调用REST web服务,我正在使用
BlockingCollection
实现生产者/消费者模式。我的web服务经常返回
502坏网关
503服务不可用

我有95%的把握网络服务正在被淹没。因此,每当我得到这些响应中的一个时,我都希望限制客户端的请求

问题: 我应该使用哪种类型的信号灯。NET4/4.5类型可以。以下是我建议的解决方案的psuedocode,消费者是并行运行的:

类工作者{
信号灯冷却时间=新信号灯();
无效运行(){
StartProducersInParallel();
StartConsumersInParallel();
}
void product(){…}
无效消耗(){
_冷却。等待(1000);
试一试{
var response=proxy.GetResponse();
}捕获(ex){
如果(例如状态==502 | |例如状态==503){
_冷却。信号();
//…在此处等待,然后重试一次
}
}
}
}

汉斯·帕桑的评论让我想到了这个解决方案:

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;
            }
        }
    }
}

因为您有消费者/生产者,所以应该使用ReaderWriterLockSlim类,而不是信号量。
表示一个锁,用于管理对资源的访问,允许多个线程进行读取或独占访问进行写入。

不清楚您考虑使用同步对象的原因。您可以使用Thread.Sleep()减慢代码速度,bool足以标记条件。@HansPassant我正在并行运行使用者。我曾考虑添加一个Thread.Sleep(),但问题是间歇性的。该解决方案会任意降低windows服务的速度,即使服务器处于空载状态。您可以使用ManualResetEvent.WaitOne(1000)降低多个线程的速度。当您得到错误返回时,调用它的Reset()方法Set(),让每一个都重新正常运行。我从来没有写过web服务。我试图在web服务过载时阻止所有使用者线程发出web请求。