| Autor |
Nachricht |
paulrei
Mitglied
Benutzerprofil
Anmeldungsdatum: 31.03.2010
Beiträge: 86
|
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
|
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
|
paulrei Mitglied
23:24:37 06.04.2012 Titel: |
|
Zitieren |
|
 |
theta
Mitglied
Benutzerprofil
Anmeldungsdatum: 26.09.2008
Beiträge: 4079
|
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
|
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
|
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
|
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
|
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
|
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
|
Firefighter Mitglied
11:40:33 07.04.2012 Titel: |
|
Zitieren |
|
 |