Pensavo di ottenere un handle su ConfigureAwait
, quindi ho provato un esperimento.C# Task ConfigureAwait
La mia comprensione è che ConfigureAwait(false)
farà la differenza solo se esiste un contesto di sincronizzazione.
ASP, WPF, ecc. Dovrebbero avere un contesto, ma le app di console e le app di servizio non dovrebbero.
Per vedere come funziona ho fatto un'applicazione Web API e incluso il seguente metodo:
// GET api/values/5
public async Task<string> Get (int id)
{
var syncCtx = SynchronizationContext.Current;
int startThreadId = Thread.CurrentThread.ManagedThreadId;
await Task.Delay(TimeSpan.FromSeconds(3)).ConfigureAwait(true);
int endThreadId = Thread.CurrentThread.ManagedThreadId;
return "Start Thread ID: " + startThreadId.ToString() +
": End Thread ID: " + endThreadId.ToString();
}
La mia previsione era che senza ConfigureAwait
o ConfigureAwait
set per true
, dovrei vedere lo stesso ID filo prima e dopo l'attesa.
I miei primi test hanno mostrato esattamente quello con il vero set come sopra.
Le successive esecuzioni del codice sono iniziate e terminate su ID di thread diversi, indipendentemente da ConfigureAwait
.
Ho aggiunto syncCtx
per convincermi che ho un contesto.
L'unica avvertenza che ho letto è che se l'attività è stata completata, non ti sarà garantito lo stesso ID. È questo il caso qui? Se è così, perché è così?
Ho impostato un test ingenuo o imperfetto? Se sì, quale sarebbe un test corretto?
Ho iniziato questo percorso in un'app console/servizio e ho realizzato che non stavo ottenendo lo stesso ID thread. Stavo aggiungendo ConfigureAwait(false)
come raccomandato nella maggior parte delle annotazioni sulla "best practice" che ho visto. Poiché mi piace vedere come funzionano davvero le cose, ho provato a testare gli ID dei thread. Vedendoli differire mi ha portato attraverso una serie di ricerche che hanno portato al codice di cui sopra.
Giusto per chiarire che non sto provando * * per ottenere lo stesso thread, solo cercando di correggere il mio fraintendimento del comportamento di ConfigureAwait. – jeffa00
Va bene, vorrei ancora leggere l'articolo della rivista MSDN. Copre abbastanza bene questi argomenti. –
Ho sicuramente intenzione di leggere quell'articolo. Grazie per il link. – jeffa00