async und await
-
@Helium: Möchtest Du auf was bestimmtes hinaus?
-
theta schrieb:
@Helium: Möchtest Du auf was bestimmtes hinaus?
Mein Wissen über
asyncundawaitsind zwar noch nicht so wirklich vollständig, aber bisher habe ich immer gelesen, dassasyncundawaitkeine neuen Threads erstellen. Um etwas im Hintergrund auszuführen, muss man dies selbst tun, in dem man zum Beispiel einenTaskerstellt und startet.Womöglich will Helium darauf raus. Und damit auch die Aussage von paulrei korrigieren:
paulrei schrieb:
Naja, in einem Thread kann man ja nix asynchron ausführen...
Doch, man kann etwas asynchron ausführen, obwohl es nur in einem Thread läuft.
Grüssli
-
Dravere schrieb:
Doch, man kann etwas asynchron ausführen, obwohl es nur in einem Thread läuft.
Grüssli
Wuerde mich mal interessieren wie das geht, kann das einer erklaeren? Kann es mir gerade nich vorstellen.
-
Meines Wissens kommen die zusätzlichen Threads vom Thread Pool.
-
Vorab: Ich will hier nicht sagen, dass ich richtig liege. Ich habe es bisher nur so verstanden!
Firefighter schrieb:
Wuerde mich mal interessieren wie das geht, kann das einer erklaeren? Kann es mir gerade nich vorstellen.
Es geht hier ein wenig um die Definition von asynchron. Asynchron heisst "nicht gemeinsam" oder "nicht miteinander". Wenn eine Methode synchron ausgeführt wird, dann wird alles an einem Stück abgearbeitet. Wenn sie asynchron mit dem
asyncSchlüsselwort ausgeführt wird, dann wird ein Teil A zuerst und später ein Teil B ausgeführt. A und B können auf dem gleichen Thread laufen, aber werden halt verzögert voneinander ausgeführt.Dabei läuft der UI-Thread, somit der Thread mit einer Nachrichtenschleife, bis zum
awaitAufruf von einenTask. Der UI Thread hängt nun einen vom Kompiler erstellten Callback an den Task (wahrscheinlich Lambda Funktion und mitContinueWith). In diesem Callback wird der Rest der Funktion über Dispatching aufgerufen. Heisst aus dem Callback wird ein Event an die Nachrichtenschleife des UI Threads geschickt, dass er eine Funktion ausführen soll, welche schlussendlich den Rest (Teil
beinhaltet.theta schrieb:
Meines Wissens kommen die zusätzlichen Threads vom Thread Pool.
Ja, allerdings wird so ein Thread durch ein
TaskObjekt angefordert.awaitruft man ja immer mit einemTaskauf. Wenn man es mit einer Funktion tut, dann auf dem zurückgegebenTaskObjekt. Man muss ja vorherTask.Startaufrufen, dort wird der Thread aus dem Thread-Pool genommen. Dafür ist man aber selber verantwortlich, das machen die Schlüsselwörterasyncundawaitnicht für einem.Grüssli
-
Ahh alles klar, danke fuer die Erklaerung.
-
@Dravere: Sehe ich auch so.
-
Danke für die vielen Antworten! Eine Sache verstehe ich immer noch nicht:
async Task button_Click([blabla...]) { blablabla... }blablabla... wird ja synchron ausgeführt. Aber wird der zurückgegebene Task (von button_Click), wenn er vom Ereignis gestartet wird, nicht bereits selber in einem neuen Thread gestartet?
-
@paulrei,
1. Der Eventhandler gibt kein Task zurück.
2. Nein, der Eventhandler wird nicht in einem neuen Thread gestartet sondern läuft ganz normal im UI-Thread wie bisher auch schon.Steht aber eigentlich alles im von dir verlinkten Tutorial

Edit: Beim nochmaligen durchlesen, bin ich mir jetzt nicht sicher, ob ich dich im Punkt zwei richtig verstanden habe.
Task.Startführt natürlich dazu, dass die Aufgabe, mit welcher dasTaskObjekt assoziiert wurde, in einem eigenen Thread gestartet wird. Aber der Eventhandler gibt keinenTaskzurück, von daher ...
Grüssli
Edit 2: Tippfehler Korrekturen, es ist eindeutig spät ...
-
Ja, ich habe den Artikel nicht ganz verstanden, sonst wäre ich ja nicht hier

@Dravere: Danke! Ich wusste gar nicht dass hier ein Unterschied zwischen Task und void besteht...