0

背景

我有一个 Windows 服务使用 调用 REST Web 服务HttpWebRequest,我正在使用BlockingCollection<T>来实现生产者/消费者模式。每隔一段时间,我的 Web 服务就会返回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
            }
        }
    }
}
4

2 回答 2

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;
            }
        }
    }
}
于 2013-02-16T23:03:20.140 回答
-1

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

于 2013-02-18T04:13:04.407 回答