0

バックグラウンド

WindowsサービスでRESTWebサービスを呼び出していますが、HttpWebRequestを使用しBlockingCollection<T>てプロデューサー/コンシューマーパターンを実装しています。502 Bad Gateway時々、私のWebサービスはまたはに戻ります503 Service Unavailable

Webサービスが氾濫していると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

Consumer/Producer があるため、Semaphore ではなく ReaderWriterLockSlim クラスを使用する必要があります。リソースへのアクセスを管理するために使用されるロックを表し、読み取り用の複数のスレッドまたは書き込み用の排他的アクセスを許可します。

于 2013-02-18T04:13:04.407 に答える