Controlla due volte il blocco dell'inizializzazione che esegue una richiesta web

0

Ho appena effettuato il refactoring del codice che gestiva una cache di stato globale di valori che non avevano il blocco per utilizzare il doppio controllo di blocco. Oltre a spostare l'inizializzazione su una singola sorgente (la cache veniva impostata su un metodo di controller), il motivo principale era assicurarsi che solo un thread stesse eseguendo l'inizializzazione alla volta.

La durata della cache è per il tempo di vita dell'applicazione, quindi una volta impostata, dovrebbe andare bene.

Ho bloccato il codice che fa la richiesta web.

Il mio collega, che ha scritto il codice iniziale, ha detto di essere preoccupato per i thread in coda che aspettano perché l'inizializzazione fa una richiesta web, e se la richiesta non riesce, l'ultimo thread deve attendere che tutto il resto passi attraverso quindi potrebbe dover aspettare un po 'e quindi la richiesta dovrebbe essere al di fuori del blocco, ma i miei pensieri sono che una richiesta è costosa e inaffidabile, e dovrebbe essere ridotta al minimo.

Poiché questa cache non scade, non è un grosso problema, ma quali sono i tuoi pensieri? Ho suggerito che se avessimo voluto la soluzione corretta, potremmo testare i blocchi, usando Monitor.TryLock, ecc. Per un blocco più sofisticato, ma probabilmente è eccessivo.

    
posta theringostarrs 05.01.2016 - 12:52
fonte

2 risposte

3

Se la richiesta web è solo richiesta per inizializzare la cache, allora sei corretto. Lancia una serratura attorno a tutto. Perché preoccuparsi di fare richieste N quando ignorerai tutto tranne il primo che ritorna?

Se la richiesta è richiesta indipendentemente dalla cache, allora il tuo collega è corretto. Consentire tutte le richieste N senza limitazioni. Il primo torna a inizializzare la cache. Lancia un blocco attorno all'inizializzazione della cache ma non alla richiesta.

A seconda dell'utilizzo, è anche possibile inizializzare con entusiasmo la cache all'avvio dell'applicazione. Non mi preoccuperei dei dati a cui raramente si accede. Ma se è assolutamente necessario, perché non afferrarlo prima e portarlo a termine?

    
risposta data 05.01.2016 - 14:49
fonte
-1

Se vuoi eseguire l'inizializzazione pigra, dovresti prendere in considerazione l'utilizzo di Lazy<T> . Non reinventare questa ruota.

Se preferisci eseguire l'inizializzazione appassionata, dovresti prendere in considerazione l'utilizzo di Task<T> .

    
risposta data 05.01.2016 - 22:21
fonte

Leggi altre domande sui tag