2016-07-11 26 views
5

Kiedy skonstruuję wystąpienie klasy, którą posiadam, chciałbym wywołać funkcję odnowienia tokena (metoda async) i pozwolić mu działać w tle (zachowuję odniesienie do zwróconego Task).Co się dzieje, gdy oczekujesz na już ukończone zadanie?

Później, gdy użytkownik uruchomi żądanie, chciałbym czekać na to Task.

Pozwala założyć, że Task kończy się po 1 sekundzie, a użytkownik uruchamia żądanie po 2 sekundach (co oznacza, że ​​zakończyło się Task).

Metoda, która obsługuje żądanie użytkownika await s to Task, czy natychmiast uzyskałaby wartość? w końcu, Task jest zakończona i przechowuje wartość.

+3

Tak, natychmiast zwróci wynik. –

+0

@MatthewWatson, dlaczego nie napisałeś tego jako odpowiedzi? Przyjąłbym twoją odpowiedź. – johni

+0

To nie było wystarczająco długie lub wystarczająco szczegółowe, aby napisać jako odpowiedź, pomyślałem. –

Odpowiedz

6

Metoda, która obsługuje żądanie użytkownika czeka na to zadanie, czy natychmiast uzyskałaby wartość?

Tak. Możesz myśleć o tym, że jesteś leniwy, jeśli wykonasz już zadanie, które powróciło natychmiast. Możesz czekać na niego kilka razy na różne wątki i powróci tylko wtedy, gdy uzyska wynik (lub jest zafałszowany).

Task.CompletedTask został dodany jako delikatny z tego powodu. Mógłbyś to uczynić await i natychmiast odeśle pomyślne zadanie, ponieważ zostało już zakończone.

0

Będziesz miał immédiat wynik. Po zakończeniu zadania jego właściwość wyniku będzie zawierać wynik i zachować go.

1

Można utworzyć zadanie wykonane przy użyciu Task.FromResult (wartość) i czekają go:

var result = await Task.FromResult(5); 
Debug.Assert(result == 5); 

Jest to przydatne na przykład, jeśli masz metodę, która może return pamięci podręcznej danych, ale musi sprowadzić je asynchronicznie pierwszy raz.

Tak, możesz czekać na ukończone zadania.