2012-01-13 20 views
11

Dlaczego wątek wywołujący wchodzi w metodę asynchroniczną, aż do wewnętrznego oczekiwania?C# 5 async/czekaj na mechanikę nici źle się czujesz?

Czy to nie czystsze odrodzenie wątku, jak tylko zostanie wywołana metoda asynchroniczna. W ten sposób wiesz na pewno, że metoda asynchroniczna zwraca się natychmiast. Nie musisz się martwić, że nie zrobisz nic kosztownego na wczesnych etapach metody asynchronicznej.

Zazwyczaj lubię wiedzieć, czy metoda będzie wykonywała kod w "moim" wątku, czy nie. Niezależnie od tego, czy blokuje, czy nie. Ten model wydaje się otwierać całe spektrum możliwości pośrednich.

Projektanci są znacznie mądrzejsi ode mnie, więc jestem pewien, że istnieje dobry powód, chciałbym się z tym pogodzić.

+0

Po to, aby wyjaśnić: Uwielbiam syntaktyczny cukier, który oznacza, że ​​nie potrzebujesz wywołań zwrotnych do robienia asynchronicznych operacji. Jest to sposób w jaki przepływają nici, co sprawia, że ​​czuję się nieswojo z jakiegoś powodu. –

+0

nie umieścisz asynchronicznego słowa kluczowego dla metod asynchronicznych, ale dla metod, które wywołują asynchroniczny kod :) –

Odpowiedz

38

Czy to nie czystsze odrodzenie wątku, jak tylko zostanie wywołana metoda asynchroniczna.

Sedno metody „asynchronicznych” jest uniknąć tarła nowy gwint.

Jesteś zagmatwany asynchronicznie z współbieżnością. Metody asynchroniczne nie muszą być uruchamiane w innym wątku, aby były asynchroniczne. Celem metod asynchronicznych jest umożliwienie dzielenia pracy na małe fragmenty, które muszą być uruchomione w konkretnej zamówieniu, ale niekoniecznie bez wykonywania innych prac nad tym samym wątkiem.

Pomyśl o nitce jako pracownik, którego możesz zatrudnić. Pomyśl o metodzie asynchronicznej jako o liście zadań z pauzami między elementami. Jeśli twoja lista rzeczy do zrobienia mówi "idź do sklepu, kup mleko i jajka, idź do domu, zrób omlet", to korzyścią async jest to, że gdy ktoś dzwoni twój telefon komórkowy między krokiem "kup jaja" a "idź" home "krok i mówi" możesz zatrzymać się w aptece w drodze do domu i odebrać moją receptę? " możesz odebrać połączenie i zaplanować pracę przed utworzeniem omletu. Dzięki metodom innym niż asynchroniczny telefon dzwoni do momentu zakończenia omletu, a następnie odbierze połączenie. UI blokuje, dopóki nie skończysz tego, co robisz.

Twoja koncepcja polega na tym, że aby zachować wątek interfejsu użytkownika, w momencie, gdy pojawi się lista rzeczy do zrobienia, zatrudnij jakiegoś faceta, który pobiegnie do sklepu, abyś mógł odebrać telefon Apteka. To jest kosztowne i niepotrzebne. Wszystko może pozostać na tym samym wątku z async, ponieważ długotrwałe zadanie ma wbudowane punkty, w których interfejs użytkownika może przerwać i zaplanować więcej pracy.

+0

Wielka analogia! Myślę, że to działa dobrze, dopóki czas między przerwami, kiedy nie mogę odebrać połączenia, nie trwa zbyt długo. Z pracownikiem do wynajęcia, NIGDY nie przegapię połączenia. Obawiam się, że przegapię połączenie, gdy mam ludzi, których mogę wynająć na tanie (wątki spawnujące), to jest źródłem mojego niepokoju, więc analogia działa świetnie nawet w wyjaśnianiu moich własnych uczuć. Zaakceptowana odpowiedź! –

+2

@HarryMexican: Jeśli uważasz, że wątki odradzania są "tanie", to asynchronizacja prawdopodobnie nie jest dla ciebie niezbędna. Uważam, że wątki odradzania są * wyjątkowo drogie * i dlatego należy ich unikać za wszelką cenę. –

+0

Wystarczająco fair. Nie robię zbyt wiele programowania UI, więc może dlatego nigdy nie zdawałem sobie sprawy z tego, jak drogie są ... W każdym razie wątek gwintowania jest drogi, odpowiada na moje pytanie. –

2

Zazwyczaj lubię wiedzieć, czy metoda będzie wykonywała kod w "moim" wątku, czy nie.

Myślę, że jest to szczególne pragnienie, nie jest to dobry argument za/przeciw jakiejkolwiek funkcji.

Głównym punktem async/await jest to, że kod do uruchamiania async op i obsługi wyników może być przechowywany w jednej metodzie.

Bez tego jesteśmy zmuszeni złamać kod, który logicznie należy do dwóch części.

3

Lubię myśleć, że async..await jest cukrem syntaktycznym dla kontynuacją programowania stylu programowania.

Mając to na uwadze, nie ma nic wspólnego z wątkami.