Ich dachte, dass sie im Grunde dasselbe sind - Programme schreiben, die Aufgaben zwischen Prozessoren aufteilen (auf Maschinen mit 2+ Prozessoren). Dann lese ich das , das sagt:
Asynchrone Methoden sollen nicht blockierende Vorgänge sein. Ein Warte-Ausdruck in einer asynchronen Methode blockiert den aktuellen Thread nicht, während die erwartete Aufgabe ausgeführt wird. Stattdessen meldet der Ausdruck den Rest der Methode als Fortsetzung und gibt die Kontrolle an den Aufrufer der asynchronen Methode zurück.
Die Schlüsselwörter async und await führen nicht dazu, dass zusätzliche Threads erstellt werden. Asynchrone Methoden erfordern kein Multithreading, da eine asynchrone Methode nicht in einem eigenen Thread ausgeführt wird. Die Methode wird im aktuellen Synchronisationskontext ausgeführt und verwendet die Zeit im Thread nur, wenn die Methode aktiv ist. Sie können Task.Run verwenden, um CPU-gebundene Arbeit in einen Hintergrundthread zu verschieben. Ein Hintergrundthread hilft jedoch nicht bei einem Prozess, der nur darauf wartet, dass Ergebnisse verfügbar werden.
und ich frage mich, ob jemand das für mich ins Englische übersetzen kann. Es scheint einen Unterschied zwischen Asynkronizität (ist das ein Wort?) Und Threading zu machen und zu implizieren, dass Sie ein Programm haben können, das asynchrone Aufgaben, aber kein Multithreading hat.
Jetzt verstehe ich die Idee von asynchronen Aufgaben wie dem Beispiel auf Seite. 467 von Jon Skeets C # In Depth, dritte Ausgabe
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();
}
}
Das async
Schlüsselwort bedeutet " Diese Funktion wird, wann immer sie aufgerufen wird, nicht in einem Kontext aufgerufen, in dem ihre Fertigstellung erforderlich ist, damit nach dem Aufruf alles aufgerufen wird."
Mit anderen Worten, schreiben Sie es mitten in einer Aufgabe
int x = 5;
DisplayWebsiteLength();
double y = Math.Pow((double)x,2000.0);
, da DisplayWebsiteLength()
hat nichts mit x
oder zu tun y
, wird DisplayWebsiteLength()
"im Hintergrund" ausgeführt, wie
processor 1 | processor 2
-------------------------------------------------------------------
int x = 5; | DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0); |
Das ist natürlich ein dummes Beispiel, aber bin ich richtig oder total verwirrt oder was?
(Außerdem bin ich verwirrt darüber, warum sender
und werde e
im Hauptteil der obigen Funktion nie verwendet.)
sender
und e
schlagen vor, dass dies tatsächlich ein Event-Handler ist - so ziemlich der einzige Ort, an dem async void
es wünschenswert ist. Dies wird höchstwahrscheinlich durch Klicken auf eine Schaltfläche oder ähnliches aufgerufen. Das Ergebnis ist, dass diese Aktion in Bezug auf den Rest der Anwendung vollständig asynchron ausgeführt wird. Aber es ist immer noch alles in einem Thread - dem UI-Thread (mit einem winzigen Zeitabschnitt in einem IOCP-Thread, der den Rückruf an den UI-Thread sendet).
DisplayWebsiteLength
Codebeispiel: Sie sollten ihn nicht HttpClient
in einer using
Anweisung verwenden. Unter hoher Last kann der Code die Anzahl der verfügbaren Sockets erschöpfen, was zu SocketException-Fehlern führt. Weitere Informationen zu Unsachgemäßer Instanziierung .