Myślałem, że to w zasadzie to samo - pisanie programów, które dzielą zadania między procesory (na komputerach z procesorami 2+). Następnie czytam to , co mówi:
Metody asynchroniczne mają być operacjami nieblokującymi. Wyrażenie oczekujące w metodzie asynchronicznej nie blokuje bieżącego wątku, gdy oczekiwane zadanie jest uruchomione. Zamiast tego wyrażenie podpisuje resztę metody jako kontynuację i zwraca kontrolę do obiektu wywołującego metodę asynchroniczną.
Słowa kluczowe asynchroniczne i oczekujące nie powodują utworzenia dodatkowych wątków. Metody asynchroniczne nie wymagają wielowątkowości, ponieważ metoda asynchroniczna nie działa na własnym wątku. Metoda działa w bieżącym kontekście synchronizacji i wykorzystuje czas w wątku tylko wtedy, gdy metoda jest aktywna. Możesz użyć Task.Run, aby przenieść pracę związaną z CPU do wątku w tle, ale wątek w tle nie pomaga w procesie, który tylko czeka na wyniki.
i zastanawiam się, czy ktoś może dla mnie przetłumaczyć to na angielski. Wydaje się, że wprowadza rozróżnienie między asynchronicznością (czy to słowo?) A wątkami i sugeruje, że możesz mieć program, który ma zadania asynchroniczne, ale nie ma wielowątkowości.
Teraz rozumiem ideę zadań asynchronicznych, takich jak przykład na pg. 467 Jona Skeeta C # In Depth, wydanie trzecie
async void DisplayWebsiteLength ( object sender, EventArgs e )
{
label.Text = "Fetching ...";
using ( HttpClient client = new HttpClient() )
{
Task<string> task = client.GetStringAsync("http://csharpindepth.com");
string text = await task;
label.Text = text.Length.ToString();
}
}
Słowo async
kluczowe oznacza „ Ta funkcja, ilekroć jest wywoływana, nie będzie wywoływana w kontekście, w którym jej zakończenie jest wymagane do wywołania wszystkiego po wywołaniu”.
Innymi słowy, pisanie go w trakcie jakiegoś zadania
int x = 5;
DisplayWebsiteLength();
double y = Math.Pow((double)x,2000.0);
, Ponieważ DisplayWebsiteLength()
nie ma nic wspólnego z x
lub y
spowoduje DisplayWebsiteLength()
być realizowane „w tle”, jak
processor 1 | processor 2
-------------------------------------------------------------------
int x = 5; | DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0); |
Oczywiście to głupi przykład, ale czy mam rację, czy jestem całkowicie zdezorientowany, czy co?
(Poza tym jestem zdezorientowany, dlaczego sender
i e
nigdy nie są używane w treści powyższej funkcji.)
sender
i e
sugerują, że jest to w rzeczywistości moduł obsługi zdarzeń - właściwie jedyne miejsce, w którym async void
jest to pożądane. Najprawdopodobniej jest to wywoływane kliknięciem przycisku lub czymś podobnym - w wyniku tego działanie to dzieje się całkowicie asynchronicznie w stosunku do reszty aplikacji. Ale wciąż jest w jednym wątku - wątku interfejsu użytkownika (z niewielkim odcinkiem czasu w wątku IOCP, który wysyła wywołanie zwrotne do wątku interfejsu użytkownika).
DisplayWebsiteLength
przykładowym kodzie: Nie powinieneś używać HttpClient
w using
instrukcji - Pod dużym obciążeniem kod może wyczerpać dostępną liczbę gniazd, co powoduje błędy SocketException. Więcej informacji na temat niewłaściwej instancji .