Laden...

warten auf await von async await

Letzter Beitrag vor 8 Jahren 3 Posts 4.631 Views
warten auf await von async await

Hallo Community,
ich hab ein Frage und hoffe das ich hier im richtigen Forum bin.

Ich hab eine Client Server Architektur und nutze eine fertige DLL dafür. Die bietet einen Listener und ein Client. Beide können nur mit async await Techniken benutzt werden.
Ich hab mir also eine Clientklasse gebaut, die folgendermaßen benutzt wird:

public async EineMethode()
{
    var hReturnValeFromServer = await MyClient.GetData("sql-befehl");
    var bsp = 1 + 1;
}

Nun ist es ja bei async await so, dass wenn der Compiler bei MyClient.GetData angekommen ist, in einem neuen Thread GetData abgearbeitet wird und der Maincompiler währenddessen weitergeht. Und zwar nach meiner Beobachtung da, wo EineMethode() aufgerufen wird. Erst wenn der await-Thread zurückkommt, wird var bsp = 1 + 1; ausgeführt.

Ich hätte es jetzt gerne, dass die await-Methode genauso aufgerufen wird, der Hauptthread aber wartet und dann bei var bsp = 1 + 1; weitergeht.
Ich hab schon versucht, await wegzulassen und auf das Result zu warten (MyClient.GetData("sql-befehl").Result). Aber irgendwie klappt das nicht. Der hängt sich dann einfach irgendwo in einem Thread auf.

Ich hoffe ich konnte mein Problem verständlich schildern. Wenn Fragen vorhanden sind, einfach schreiben.
Ich bin leider in dem ganzen Threading und async await Features nicht fit...

Danke schonmal!

Eine async Methode sollte immer einen Task zurück geben:

public async Task<int> GetIntAsync()
{
    await DoSomethingAsync();
    return 5;
}
public async Task DoSomethingAsync()
{
    await Task.Factory.StartNew(() => { /* do something */ });
}

Ein solcher Task hat dann eine Wait-Methode, die Du nutzen kannst um im aktuellen Thread zu warten.

Allerdings muss dann das await beim Aufruf weg, denn das sorgt dafür, dass asynchron auf den Task gewartet wird. Lässt Du das weg, bekommst Du den Task zurück gegeben.

NuGet Packages im Code auslesen
lock Alternative für async/await

Beim CleanCode zählen nicht die Regeln, sondern dass wir uns mit diesen Regeln befassen, selbst wenn wir sie nicht befolgen - hoffentlich nach reiflichen Überlegungen.

Dein Code ist falsch und auch etwas sinnfrei.
Könntest Du bitte einen Code posten, der Dein Problem genau beschreibt?
Weil Dein Code keinen Sinn macht wird erfolgt auch nicht das, was Du da aktuell gerne hättest.

Zu Deinem Text:
async/await arbeitet mit Tasks, nichts direkt mit Threads.

  • Hinter einem Task steht ein Thread.
  • Ein Thread kann mehreren Tasks zur Verfügung stehen
  • Der Thread eines Tasks kann wechseln

Ansonsten kann ich Dir beim Text nicht ganz folgen.
Ich weiß nicht, was Du mit Maincompiler meinst oder was das sein soll. Vermutlich meinst Du hier einen Thread und keinen Compiler.

Damit Du async/await wirklich beherrschst, solltest Du lesen und verstehen, was dahinter steckt.
Asynchrone Programmierung mit Async und Await - Was passiert in einer asynchronen Methode?

Dazu gibt es hunderte Tutorials und Blogeinträge, manche oberflächlicher aber deswegen nicht schlechter beschrieben(Stephen Cleary: Async and Await) und manche tiefer (Chris Hurley: The overhead of async/await in NET ).

Ganz oft wird async/await für Dinge verwendet oder gehalten, wofür es gar nicht gedacht ist.
Aufgrund des Overheads kann async/await sogar negative Auswirkungen haben, wenn es falsch verwendet wird.