Sto utilizzando un lavoro Web con l'SDK di archiviazione di Windows Azure. Quando un nuovo oggetto appare in una coda, viene invocato un metodo nella mia classe. Secondo lo SDK docs, se prendo un TextWriter come parametro per il mio metodo, l'SDK mi fornirà un TextWriter che posso scrivere su cui apparirà l'infrastruttura di registrazione di Webjob. Ciò semplifica la diagnosi dei problemi e la risoluzione dei problemi.Il logger di TextWriter di Webjob di Azure è disposto nel mezzo del mio metodo
public async static void ProcessQueueMessage([QueueTrigger("queueName")]MyModelType model, TextWriter logger)
{
await logger.WriteLineAsync(string.Format("Processing Item {0}", model.SasUrl));
// Some work here
await logger.WriteLineAsync(string.Format("Done Processing Item {0}", model.SasUrl));
}
Tuttavia, molto frequentemente, all'interno del corpo del mio metodo, il TextWriter viene eliminato. Sto ottenendo la seguente eccezione al 2 ° logger.WriteLineAsync:
System.ObjectDisposedException was unhandled by user code
HResult=-2146232798
Message=Cannot write to a closed TextWriter.
Source=mscorlib
ObjectName=""
StackTrace:
at System.IO.__Error.WriterClosed()
at System.IO.StringWriter.Write(Char[] buffer, Int32 index, Int32 count)
at System.IO.TextWriter.WriteLine(String value)
at System.IO.TextWriter.SyncTextWriter.WriteLine(String value)
at System.IO.TextWriter.SyncTextWriter.WriteLineAsync(String value)
at NameOfProject.Program.<ProcessQueueMessage>d__8.MoveNext() in c:\Dev\Path\To\Program.cs:line 173
InnerException:
non riesco a trovare altri che hanno questo problema, quindi non posso immaginare che ci sia un bug nel infrastrutture SDK o webjobs.
C'è un modo per dire se il logger è smaltito prima della chiamata?
C'è un modo per creare un nuovo logger nel mio metodo che parteciperà ai sottosistemi di registrazione e all'interfaccia utente di WebJobs?
Niente di ovvio per me, ma suppongo che si tratti di una sorta di problema asincrono. C'è una varietà di bug di casi d'angolo possibili con applicazioni di console statiche void asincrone. Potresti provare a rilasciare asincrono e vedere se si ripete ancora? –
C'è qualche motivo particolare per l'utilizzo async atteso all'interno del gestore WebJob? Secondo la mia comprensione, il tuo lavoro web verrà invocato in un thread diverso da quello principale di SDK. In modo che il thread principale non sarà mai disturbato. –