Ciao a tutti,
in asp.net 4 (e quindi non 4.5) ho un testo html che deve visualizzare n immagini dinamiche partendo dallo stesso handler (image.ashx). Fino a qui tutto funziona correttamente.
Mi sono reso conto che, in caso di più immagini in un'unica richiesta, il codice viene attraversato in debug più volte contemporaneamente.
Ho letto degli async httphandler. E' quello che mi serve?
Oppure gestisce tutto l'httphandler sincrono?
Nota: l'handler compone immagini e testo ma questo non dovrebbe essere importante.
grazie
Modificato da manuel0081 il 19 luglio 2016 15.39 -

Ormai programmano tutti... ma la professionalità appartiene a pochi
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Manuel,

il codice viene attraversato in debug più volte contemporaneamente.

Ok, quindi ci sono richieste concorrenti ad image.ashx e questo causa un problema.

Che tipo di problema, esattamente? Le varie richieste a Image.ashx si contendono una risorsa, tipo che l'handler va a scrivere sempre sullo stesso file fisico e lo trova bloccato da una precedente esecuzione?

Per evitare che due thread si contendano la stessa risorsa potresti usare un lock, ma è una soluzione pessimistica che causerà degli aumenti nei tempi di caricamento. La cosa migliore sarebbe rimuovere la contesa sulla risorsa però dovresti spiegare perché è un problema che ci siano più richieste contemporanee all'handler.

Usare un handler asincrono non ti aiuterà a risolvere questo problema specifico.

ciao,
Moreno
Modificato da BrightSoul il 19 luglio 2016 21.18 -

Enjoy learning and just keep making
Il problema è stato riscontrato quando ho usato imamgini di dimensioni diverse. In pratica creo delle immagini a partire da immagini e testo affiancato. Il calcolo delle dimensioni della nuova immagine avviene a partire da quelle dell'immagine base + un offset orizzontale + la dimensione del testo.
In debug mi rendo conto dei vari flussi ma in realtà le variabili sembrano assumere i valori corretti.
L'inserimento di lock è escluso.

Ormai programmano tutti... ma la professionalità appartiene a pochi
11.886 messaggi dal 09 febbraio 2002
Contributi
Per caso nell'handler hai definito dei campi privati che vai a valorizzare dal metodo ProcessRequest?

Se sì, allora potrebbe spiegare il problema perché ASP.NET può riutilizzare la stessa istanza dell'handler se la sua proprietà IsReusable vale true.

Per il momento prova ad impostarla a false, così ASP.NET andrà a ricreare una nuova istanza ad ogni richiesta e non c'è rischio che invocazioni contemporanee all'handler vadano a scrivere e leggere sugli stessi campi privati.
public class TuoHandler : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        //Tuo codice
    }

    public bool IsReusable
    {
        get
        {
            //Qui restituisci false
            return false;
        }
    }
}


Se non hai né campi privati né campi statici e se - in generale - non si verificano contese su risorse condivise, allora il problema non è sicuramente causato da richieste contemporanee ma dev'essere altrove.

ciao,
Moreno

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.