TaskCompletionSource - Próba zrozumienia bezwolnej pracy asynchronicznej

Próbuję zrozumieć celTaskCompletionSource i jego związek z pracą asynchroniczną / bez wątków. Myślę, że mam ogólny pomysł, ale chcę się upewnić, że moje zrozumienie jest poprawne.

Po raz pierwszy zacząłem szukać w Bibliotece Równoległych Zadań (TPL), aby dowiedzieć się, czy istnieje dobry sposób na stworzenie własnej pracy bez wątków / asynchronizacji (powiedzmy, że starasz się poprawić skalowalność swojej strony ASP.NET) oraz zrozumienie TPL wygląda na to, że będzie bardzo ważne w przyszłości (async/await). Co doprowadziło mnie doTaskCompletionSource.

Z mojego zrozumienia to wygląda jak dodanieTaskCompletionSource do jednej z twoich klas tak naprawdę nie robi zbyt wiele, ponieważ czyni async kodowania; jeśli nadal wykonujesz kod synchronizacji, połączenie z Twoim kodem zostanie zablokowane. Myślę, że dotyczy to nawet interfejsów API Microsoft. Na przykład powiedz wDownloadStringTaskAsync off ofWebClient klasa, każdy kod konfiguracji / synchronizacji, który robią na początku, zostanie zablokowany. Kod, który wykonujesz, musi działać na jakimś wątku, albo w bieżącym wątku, albo będziesz musiał wyłączyć nowy.

Więc używaszTaskCompletionSource w swoim własnym kodzie, gdy dzwonisz do innegoasync wywołania od Microsoft, aby klient twoich klas nie musiał tworzyć nowego wątku, aby twoja klasa nie blokowała.

Nie wiesz, jak Microsoft wewnętrznie wykonuje swoje asynchroniczne API. Na przykład jest nowyasync metoda wyłączonaSqlDataReader dla .Net 4.5. Wiem, że istnieją porty IO Completion. Myślę, że jest to abstrakcja niższego poziomu (C ++?), Której prawdopodobnie większość programistów C # nie będzie używać. Nie jestem pewien, czy Porty zakończenia IO będą działać w przypadku połączeń z bazą danych lub połączeń sieciowych (HTTP) lub jeśli zostaną użyte tylko do pliku IO.

Więc pytanie brzmi: czy mam rację w moim zrozumieniu, prawda? Czy są pewne rzeczy, które przedstawiłem nieprawidłowo?

questionAnswers(2)

yourAnswerToTheQuestion