Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C# und .NET ::  async und await  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
paulrei
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.03.2010
Beiträge: 86
Beitrag paulrei Mitglied 22:56:20 06.04.2012   Titel:   async und await            Zitieren

Hallo,
ich setze mich im Moment mit den in C# 5.0 neuen Schlüsselwörtern async und await auseinander. Sie funktionieren sehr gut und ich verwende sie deshalb auch schon. Nur eine Sache ist mir unklar:
Ich dachte, der Compiler macht aus z.B.
Code:
async Task DoSomethingAsync()
{
    await Something();
    while(true) ;
}

ein Callback, wie man es normalerweise tun würde. Dann würde im Hintergrund ein zweiter Thread laufen, der sich "aufgehängt" hat.
Aber nein: Stattdessen hängt sich meine Windows Form UI auf. Aber wieso? Irre ich mich, dass die while-Schleife in einem zweiten Thread läuft? Was habe ich falsch verstanden?

Liebe Grüße
paulrei

_________________
http://backslashes.funpic.de
Keine Langeweile mehr bei Fortschrittsleisten (OPEN SOURCE): PatienceBar
Helium
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.03.2002
Beiträge: 3549
Beitrag Helium Mitglied 23:18:41 06.04.2012   Titel:              Zitieren

Wie kommst du auf einen zweiten Thread?

_________________
Manual memory management is premature optimization.
paulrei
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.03.2010
Beiträge: 86
Beitrag paulrei Mitglied 23:24:37 06.04.2012   Titel:              Zitieren

Naja, in einem Thread kann man ja nix asynchron ausführen...
http://blogs.infosupport. ....... ed-as-simple-as-possible/

_________________
http://backslashes.funpic.de
Keine Langeweile mehr bei Fortschrittsleisten (OPEN SOURCE): PatienceBar


Zuletzt bearbeitet von paulrei am 23:25:06 06.04.2012, insgesamt 1-mal bearbeitet
theta
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 4079
Beitrag theta Mitglied 23:25:23 06.04.2012   Titel:              Zitieren

Zitat:
Aber nein: Stattdessen hängt sich meine Windows Form UI auf. Aber wieso? Irre ich mich, dass die while-Schleife in einem zweiten Thread läuft? Was habe ich falsch verstanden?


Ja, falsch verstanden, Something() wird asynchron ausgeführt (= der aufrufende Thread blockiert nicht) - wenn Something() fertig ist gehts an der Stelle nach dem await weiter (und zwar auf dem Thread der DoSomethingAsync() aufgerufen hat) - bei dir kommt da eine Endlos-Schleife. Da hängt der aktuelle Thread dann bis auf weiteres.
paulrei
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.03.2010
Beiträge: 86
Beitrag paulrei Mitglied 23:32:08 06.04.2012   Titel:              Zitieren

Wie sieht das dann aus?
1. Thread ruft DoSomethingAsync() im 2. Thread auf
2. Thread ruft eine Callbackfunktion im 1. Thread auf, die die while-Schleife aufruft.
Aber wie soll das denn gehen? Wenn ich die Callback-Funktion aufrufe, dann läuft diese doch auch im 2. Thread!

_________________
http://backslashes.funpic.de
Keine Langeweile mehr bei Fortschrittsleisten (OPEN SOURCE): PatienceBar
theta
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 4079
Beitrag theta Mitglied 23:56:05 06.04.2012   Titel:              Zitieren

paulrei schrieb:
Wie sieht das dann aus?
1. Thread ruft DoSomethingAsync() im 2. Thread auf
2. Thread ruft eine Callbackfunktion im 1. Thread auf, die die while-Schleife aufruft.
Aber wie soll das denn gehen? Wenn ich die Callback-Funktion aufrufe, dann läuft diese doch auch im 2. Thread!

Punkt 1 ist richtig
Punkt 2 ist richtig

Wie soll das gehen?
Das "Callback" wird auf den "ursprünglichen" Thread zurück ge-marshallt (mit einem Dispatcher Objekt o.ä.).

Edit: BTW: das ist sogar einstellbar, weil manchmal ist das mit dem marshallen gar nicht nötig.


Zuletzt bearbeitet von theta am 23:56:41 06.04.2012, insgesamt 1-mal bearbeitet
Helium
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.03.2002
Beiträge: 3549
Beitrag Helium Mitglied 09:38:54 07.04.2012   Titel:              Zitieren

Eric Lippert schrieb:
The whole point of "async" methods is to avoid spawning a new thread.

You are confusing asynchrony with concurrency. Asynchronous methods need not run on another thread to be asynchronous. The point of asynchronous methods is that they allow you to break up work into little pieces that need to run in a particular order, but not necessarily without doing other work on the same thread.

Think of a thread as a worker you can hire. Think of a async method as a to-do list with pauses between the items. If your to-do list says "go to the store, buy milk and eggs, go home, make an omelette", then the benefit of async is that when someone calls your cell phone between the "buy eggs" step and the "go home" step and says "can you stop by the pharmacy on your way home and pick up my prescription?" you can take the call and schedule the work before you make the omelette. With non-async methods, your phone keeps ringing until the omelette is done, and then you take the call. The UI blocks until you're done what you're doing.

Your concept is that in order to keep the UI thread responsive, the moment you get the to-do list you go hire some guy to run to the store for you, so that you're free to take the call about the pharmacy. That is expensive and unnecessary. Everything can stay on the same thread with async because the long-running task has built-in points where the UI gets to interrupt and schedule more work.

_________________
Manual memory management is premature optimization.
theta
Mitglied

Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 4079
Beitrag theta Mitglied 10:16:32 07.04.2012   Titel:              Zitieren

@Helium: Möchtest Du auf was bestimmtes hinaus?
Dravere
Moderator

Benutzerprofil
Anmeldungsdatum: 13.06.2005
Beiträge: 8179
Beitrag Dravere Moderator 11:34:43 07.04.2012   Titel:              Zitieren

theta schrieb:
@Helium: Möchtest Du auf was bestimmtes hinaus?

Mein Wissen über async und await sind zwar noch nicht so wirklich vollständig, aber bisher habe ich immer gelesen, dass async und await keine neuen Threads erstellen. Um etwas im Hintergrund auszuführen, muss man dies selbst tun, in dem man zum Beispiel einen Task erstellt 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

_________________
Danke für die Hilfe, Antwort oder Meinung!
C++: Std-Lib Referenz
C# .Net: MSDN kennt die Antwort
Firefighter
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.03.2007
Beiträge: 2932
Beitrag Firefighter Mitglied 11:40:33 07.04.2012   Titel:              Zitieren

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.

_________________
Mein Blog
Clean-Code-Developer
Wie man richtig Fragen stellt
c++.de :: C# und .NET ::  async und await  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.