Code:
Co czyni powyższą metodę asynchroniczną?
- sygnatura metody zawiera słowo kluczowe async
- nazwa metody zawiera przyrostek Async
- typ zwracany to:
- Task<TResult>
- Task
- void
- metoda zawiera przynajmniej jedno słowo kluczowe await
Fakty związane z async i await:
- Należy pamiętać że await nie tworzy nowego wątku. Jeżeli chcemy, aby został stworzony nowy wątek można skorzystać z nowej metody Task.Run, która jest skrótem od Task.Factory.StartNew.
- Jeżeli metoda nie zawiera, żadnego słowa kluczowego await, będzie wykonywana tak jak zwykła metoda synchroniczna. Ze strony kompilatora zostanie zgłoszone jedynie ostrzeżenie o takim fakcie.
- Jeżeli metoda zwraca Task dostajemy informację o stanie zadania, rezultat bądź też wyjątek co poszło nie tak podczas wykonywania naszego kodu.
- Metoda async nie może przyjmować parametrów przekazywanych przez referencję (ref). Może jednak w sobie wywoływać metody, przyjmujące parametry w ten sposób.
Mała uwaga co do tytułu powinno być acync zamiast asynch.
OdpowiedzUsuńDzięki, poprawione
UsuńInteresujące.
OdpowiedzUsuńTylko mam wątplikowości co się stanie gdy osiągniemy await, a GetStringAsync nie zakończyło się jeszcze?
Co wtedy zwróci funckja GetDataLengthAsync?
Nastąpi oczekiwanie na rezultat. Powyższe można by zapisać w następujący sposób:
Usuńvar newTask = new Task(() => 20);
newTask.Start();
newTask.ContinueWith(new Action(task1 => { int a = 20; }),
TaskScheduler.FromCurrentSynchronizationContext());
Tak więc await można traktować jak ContinueWith.