2015-07-20 11 views
7

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?

+0

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? –

+0

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. –

risposta

27

Ecco perché il metodo restituisce void. Prova a restituire Task invece

+2

Ha fatto lo stesso errore. Credo che da quando ho restituito il void il thread chiamante non ha aspettato il completamento del metodo e ha disposto lo scrittore del testo. Dovrebbe essere contrassegnato come una soluzione. – Martin

+0

Grazie! Ho passato solo due ore a cercare di capire perché il mio TextWriter era stato smaltito. – peregrination

+0

Qualche idea del perché vedrei lo stesso errore anche se non sto usando async? – Sean