710 messaggi dal 13 novembre 2008
Contributi
ciao,
ho un webjob continuo che fa il resize delle immagini (azure blob) a seguito del messaggio di coda ricevuto dalla webapp dopo un upload.
al momento di presentare le immagini sulla pagina principale attualmente verifico che il thumb sia stato generato mandando una richiesta http HEAD; la verifica può riguardare centinaia di immagini

Ho pensato a una soluzione alternativa direttamente nel webjob, del tipo:

...

Task uploadTask = outputBlob.UploadFromStreamAsync(stream);

while (!uploadTask.IsCompleted)
{
}

if (uploadTask.IsFaulted) { //TODO! error log }

else { //TODO! inserisco in azure table dati per la verifica
//nella pagina principale al posto della chiamata http verifico
//che nella table sia stato scritto il nome del thumb generato }

stream.Dispose();



il mio dubbio è se quando la task è completata il thumb sia realmente disponibile

poi non so cosa costi di più in termini di risorse, la chiamata http o la chiamata alla table....

grazie!
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao,

non so cosa costi di più in termini di risorse, la chiamata http o la chiamata alla table....

Credo sia preferibile fare una sola chiamata alla table per caricamento di pagina. Chiedi alla table di restituirti l'elenco delle thumb esistenti a partire dall'elenco che devi visualizzare nella pagina.

Oppure puoi usare un approccio ottimistico: non fai alcuna chiamata, né http né alla table ma assumi che tutte le thumb esistano. I tag image li generi così:
<img src="url_della_thumb" onerror="this.src='noimage.png'" />


Se l'url della thumb dovesse restituire un 404, il javascript che si trova nell'onerror lo sostituirebbe con il percorso ad un'immagine noimage.png.

Dipende da quanti sono i 404. Se sono pochi, forse vale la pena di usare questo approccio.

Task uploadTask = outputBlob.UploadFromStreamAsync(stream);

while (!uploadTask.IsCompleted)
{
}

Occhio qui che il while consuma CPU come se non ci fosse un domani. Usa assolutamente un await per attendere il termine dell'upload.

await outputBlob.UploadFromStreamAsync(stream);


Se per qualche motivo non puoi usarlo (ma spiega il perché), puoi usare ContinueWith.
Leggi qui:
https://www.codeproject.com/Articles/1018071/ContinueWith-Vs-await

ciao,
Moreno

Enjoy learning and just keep making
710 messaggi dal 13 novembre 2008
Contributi
l'await non è un problema metterlo, il dubbio per cui non l'ho messo è per il fatto che il resize viene chiamato da un controller che quindi manderebbe il messaggio di coda fermandosi ad aspettare la fine dell'esecuzione prima di fare il resto(??)

                CloudQueue queueresizethumbs = queueClient.GetQueueReference("resizthumbs");
                await queueresizethumbs.CreateIfNotExistsAsync();
                await queueresizethumbs.AddMessageAsync(new CloudQueueMessage(JsonConvert.SerializeObject(blobInfo)));

                CloudQueueMessage retrievedMessage = await queueresizethumbs.GetMessageAsync();


ma posso risolvere separando le funzionalità, mandando la coda al webjob da una api attraverso una chiamata ajax lato client, non è un problema

dunque sostituendo

Task uploadTask = outputBlob.UploadFromStreamAsync(stream);

while (!uploadTask.IsCompleted)
{
}


con

await outputBlob.UploadFromStreamAsync(stream);

//inserisco in table i dati


elimino il problema del while, inserisco i dati in table al termine dell'upload eliminando le chiamate http

L'approccio ottimistico è interessante, i 404 potrebbero essere molti soprattutto a ridosso del termine dell'upload , dipende da quante immagini e dal loro peso che il webjob deve elaborare, potrei fare qualche test...

grazie!

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.