我应该使用哪种信号量类型进行客户端HttpWebRequest限制?

时间:2013-02-16 19:35:45

标签: .net multithreading http

背景

我有一个Windows服务使用HttpWebRequest调用REST Web服务,我使用BlockingCollection<T>来实现Producer / Consumer模式。我的网络服务经常会返回502 Bad Gateway503 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
            }
        }
    }
}

2 个答案:

答案 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。 表示用于管理对资源的访问的锁,允许多个线程进行读取或独占访问以进行写入。