Ho il seguente codice in C#, VS2012, WPF 4.5. La mia aspettativa sarebbe che, .ContinueWith
verrà eseguito dopo che l'attività è stata completata completamente (che è l'intero scopo della continuazione, non è vero?).. Si avvia prima che l'attività sia completata
Ciò dovrebbe comportare un valore di 2 in finalResult
.
int myTestInt = 0;
Task task = Task.Factory.StartNew(async() =>
{
myTestInt = 1;
await Task.Delay(TimeSpan.FromSeconds(6));
myTestInt = 2;
}).ContinueWith(_ =>
{
int finalResult = myTestInt;
});
Infatti, finalResult
viene assegnato un valore di 1, invece. Quindi sembra che la continuazione sia già iniziata sulla dichiarazione await
.
È questo il comportamento previsto? Mi sto perdendo qualcosa qui? Non posso contare su ContinueWith
per iniziare dopo che un'attività è stata completata?
Aggiornamento:
risposta di Justin appena mi ha ispirato a verificare quanto segue:
int myTestInt = 0;
Task task=Task.Factory.StartNew(async() =>
{
myTestInt = 1;
await Task.Delay(TimeSpan.FromSeconds(6));
myTestInt = 2;
});
task.Wait();
int result2 = myTestInt;
finalResult è ancora impostato a 1. Non c'è modo di aspettare in modo affidabile per un'attività che contiene await
s per completare ?
Penso che dovresti invocare 'Task.Delay' direttamente - non usando la parola chiave' await'. –
Si noterà che '_' è in realtà un' Task ', che supporta completamente ciò che sta dicendo Justin ... –
Infatti, l'uso di Task.Delay (6) produrrà il risultato previsto, ma non attenderà 6 secondi . Penso che sarebbe praticamente lo stesso per cancellare l'intera linea. –