Mam następujący kod w C#, VS2012, WPF 4.5. Oczekuję, że .ContinueWith
zostanie wykonane po zakończeniu zadania (to jest cały cel kontynuacji, prawda?).. Kontynuacja rozpoczyna się przed zakończeniem zadania
Powinno to skutkować wartością 2 w finalResult
.
int myTestInt = 0;
Task task = Task.Factory.StartNew(async() =>
{
myTestInt = 1;
await Task.Delay(TimeSpan.FromSeconds(6));
myTestInt = 2;
}).ContinueWith(_ =>
{
int finalResult = myTestInt;
});
W rzeczywistości finalResult
ma przypisaną wartość 1. Wygląda na to, że kontynuacja została już rozpoczęta na oświadczeniu await
.
Czy to jest zamierzone zachowanie? Czy coś mi umyka? Czy nie mogę polegać na ContinueWith
, aby rozpocząć po zakończeniu zadania?
Aktualizacja:
odpowiedź Justina właśnie zainspirowało mnie, aby sprawdzić, co następuje:
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 jest nadal ustawiony na 1. Czy nie ma sposobu, aby wiarygodnie czekać na zadania, które zawiera await
s, aby zakończyć ?
Myślę, że powinieneś wywołać 'Task.Delay' bezpośrednio - nie używając słowa kluczowego' await'. –
Zauważysz, że '_' jest w rzeczywistości' Zadanie ', które w pełni obsługuje to, co Justin mówi ... –
W rzeczywistości przy użyciu Task.Delay (6) spowoduje oczekiwany wynik, ale nie będzie czekać 6 sekund . Myślę, że usunięcie całej linii byłoby prawie takie samo. –