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?