2017-12-03 75 views
5

Biorąc pod uwagę metodę transmisji asynchronicznej:Łańcuch wywoławczy dla asynchronizacji/czekania ... Czekaj na czekanie lub zwróć oczekiwane?

public async Task<int> InnerAsync() 
{ 
    await Task.Delay(1000); 
    return 123; 
} 

i nazywając go przez metody pośrednie, powinny metoda pośrednia czekają metodę transmisji asynchronicznej (IntermediateA) lub jedynie powrotu zadania (IntermediateB)?

pubic async Task<int> IntermediateA() 
{ 
    return await InnerAsync(); 
} 

private Task<int> IntermediateB() 
{ 
    return InnerAsync(); 
} 

Jak najlepiej mogę powiedzieć z debuggera, zarówno wydają się działać dokładnie tak samo, ale wydaje mi się, że IntermediateB powinien wykonać lepiej, unikając jedno wejście czekają w maszynie państwowej.

Czy to prawda?

+3

Różnica dotyczy obsługi wyjątków. Aby to lepiej zrozumieć, sugeruję, abyś spróbował rzucić wyjątek od wewnętrznej funkcji i zobaczyć, jak działa. –

+0

Dziękuję. W ogóle nie rozważałem obsługi wyjątków. – MikeZ

+0

"Wydaje mi się, że IntermediateB powinien działać lepiej" - tak, ale różnica będzie wynosić kilka nanosekund. Może również zaoszczędzić kilkadziesiąt bajtów w wygenerowanym pliku binarnym. –

Odpowiedz

6

Istnieją subtelne różnice w tych dwóch podejściach. Jeśli nie powiodło ci się zadanie await, wyjątek zostanie zgłoszony w tej metodzie, ale jeśli przekażecie zadanie, myśleli tę metodę, a następnie await, wyjątek zostanie zgłoszony w metodzie konsumenta. Kolejna różnica występuje rzadziej, gdy konsument oczekuje na zadanie, a jeśli wystąpiło z opóźnieniem, zadanie można zakończyć w oczekiwaniu i ominąć automat stanowy.

+0

Dziękuję. W ogóle nie rozważałem obsługi wyjątków. – MikeZ

+0

Co z wydajnością? Czy to nie tworzy dwóch maszyn stanu (oczekujących na wewnętrzną)? – Mardoxx

+0

Bez próby/catch, wyjątek będzie propagować do rozmówcy. Czy możesz wskazać na istotną różnicę praktyczną? –

Powiązane problemy