In c# 4.0 è bellissimo usare le nuove keywords quali async e await… solo che però nascondono qualche insidia ad esempio:
async void LoadOperazioni()
{
this.IsBusy = true;
var q = ViewModelLocator.DomainService.GetLogQuery();
try
{
var lstOperazioni = await ViewModelLocator.DomainService.LoadAsync(q, LoadBehavior.RefreshCurrent);
…operazioni varie
}
catch (System.Exception e)
{
}
finally
{
this.IsBusy = false;
}
}
Questo codice vorrebbe mettere la proprietà IsBusy = false alla fine dell’operazione sia che sia andata bene sia che sia andata male. Ebbene, non funzionerà, infatti all’istruzione await uscirà dalla clausola try/catch/finally ed eseguirà immediatamente l’istruzione IsBusy=false. Questo perchè comunque sia il compilatore interpreterà l’await come la costruzione di un thread separato del quale si rimarrà in attesa dell’evento di completamento del thread stesso.
Occhio quindi quando utilizzate async e await, che per quanto siano belle come nuove keywords possono nascondere queste e altre insidie