2014-09-08 7 views
6

Czy ktoś wie, jaki jest cel tego działania?C# czeka na/async w WebApi, o co chodzi?

private async Task<bool> StoreAsync(TriviaAnswer answer) { ... } 

[ResponseType(typeof(TriviaAnswer))] 
public async Task<IHttpActionResult> Post(TriviaAnswer answer) 
{ 
    var isCorrect = await StoreAsync(answer); 
    return Ok<bool>(isCorrect); 
} 

Z tego powodu informuje, że należy uruchomić asynchronicznie metodę prywatną, ale synchronicznie czekać na jej zakończenie. Moje pytanie brzmi: czy jest w tym jakiś sens? A może to tylko wymyślna, ale daremna technika? Wpadłem na to podczas nauki kodu Web API/MVC/SPA.

W każdym razie przydatne byłyby wszelkie spostrzeżenia.

+0

1) Proszę pokazać typ zwrotu 'MyMethod()' to jest trochę ważne. I 2) Gdzie jest syncroniczne oczekiwanie, o którym wspomniałeś, twój przykładowy kod go nie ma. –

+0

Wierzę, że oczekiwanie synchroniczne występuje w 'await'. Niedługo zaktualizuję kod. – beautifulcoder

+2

deffination 'await' jest asynchronicznym oczekiwaniem. Synchroniczne oczekiwanie to 'var isCorrect = StoreAsync (odpowiedź) .Result;' –

Odpowiedz

8

Pomimo swojej nazwy await nie działa tak jak Thread.Join. async i await są implementacją firmy Microsoft coroutines, zaimplementowaną przy użyciu stylu kontynuacji przekazywania. Prace zostały zmienione, aby można było kontynuować przetwarzanie, gdy trwa proces Task<T>. Instrukcje są porządkowane przez kompilator w celu maksymalnego wykorzystania operacji asynchronicznej.

This article wyjaśnia to wygląda następująco:

czekają wyraz nie blokuje nić, na której jest wykonywany. Zamiast tego powoduje, że kompilator rejestruje resztę asynchronicznej metody jako kontynuację oczekiwanego zadania. Control następnie wraca do wywołującego metody asynchronicznej. Po zakończeniu zadania wywołuje jego kontynuację, a wykonanie metody asynchronicznej wznawia się tam, gdzie zostało przerwane.

Dla niektórych banalnych przykładów kodu, await nie ma większego sensu, ponieważ nie ma innej pracy, którą można wykonać w międzyczasie, gdy oczekujesz.

+0

Nie ma innej pracy, którą można wykonać w międzyczasie, gdy oczekujesz. Czy możesz to wyjaśnić? Jeśli zostanie wykonane wiele połączeń do 'Post', wątek może zacząć wyświetlać żądanie bez czekania na zakończenie zadania. – Shoe

+0

Robert, Zauważyłem, że używając async/await, uwalniasz wątki, aby mogły wykonywać inne żądania aż do zakończenia zadania. Poprawiłoby to ogólną wydajność, zwiększając efektywność aplikacji (tj. Każdy wątek nie jest bardziej wydajny, użytkownicy tego nie zauważyliby, ale raczej ułatwili pracę na serwerze). Czy jest w tym jakaś prawda, czy też brakowało mi sensu? –

+0

@RowanFreeman: Powiedziałbym, że, zmieniając kolejność instrukcji, które robią wątki, sprawiasz, że działają one wydajniej, a więc potrzebujesz mniejszej liczby, aby wykonać tę samą pracę. Tracisz wątki rzadziej, ponieważ nie czekają już na blokowanie połączeń. –