Mischen async / erwarten mit Ergebnis

7

Lassen Sie mich diese Frage nur mit ein paar Dingen vortragen:

  1. Ich habe mehrere SO-Fragen gelesen, die besagen, dass Sie nicht das tun sollten (z. B. So vermischen Sie sicher Sync- und Async-Code )
  2. Ich habe Async / Await - Best Practices in Asynchronous Programming gelesen, in dem Sie erneut darauf hinweisen, dass Sie nicht sollten tu das nicht

Ich weiß also, dass dies keine Best Practice ist, und niemand braucht mir das zu sagen. Dies ist eher eine Frage, "warum funktioniert das?".

Hier ist meine Frage:

Ich habe eine kleine GUI-Anwendung geschrieben, die zwei Schaltflächen und eine Statusbezeichnung hat. Eine der Schaltflächen reproduziert das Deadlock-Problem mit Sync und Async 100% der Zeit. Die andere Schaltfläche ruft die gleiche async-Methode auf, aber sie ist in eine Task eingebettet, diese funktioniert. Ich weiß, dass dies keine gute Programmierpraxis ist, aber ich möchte verstehen, warum es nicht das gleiche Deadlock-Problem hat. Hier ist der Code:

%Vor%     
Middas 28.07.2016, 17:14
quelle

2 Antworten

11

Es funktioniert, weil der buttonWorking_Click async-Code ( DelayAsync sowie das async lambda, das an Task.Run übergeben wurde) kein aktuelles SynchronizationContext hat, während der buttonDeadlock_Click async-Code ( DelayAsync ) ) tut es. Sie können den Unterschied beobachten, indem Sie den Debugger ausführen und SynchronizationContext.Current beobachten.

Ich erkläre die Details hinter dem Deadlock-Szenario in meinem Blogpost Do not Blockieren Sie den Async-Code .

    
Stephen Cleary 28.07.2016, 17:18
quelle
9

Szenario eins: Sie sitzen an Ihrem Schreibtisch. Es gibt einen Posteingang. Es ist leer. Plötzlich erscheint ein Stück Papier in Ihrem Posteingang und beschreibt eine Aufgabe. Du springst auf die Füße und rennst herum und machst die Aufgabe. Aber was ist die Aufgabe? Es sagt Folgendes zu tun:

  • Ändern Sie das Whiteboard, um "running" zu sagen - OK, Sie tun das.
  • Stellen Sie Ihren Wecker für eine Stunde später ein. OK, das machst du.
  • Erstellen Sie ein neues Stück Papier, auf dem steht: "Wenn der Wecker klingelt, schreiben Sie das Wort FERTIG auf das Whiteboard". Legen Sie es in Ihren Posteingang. Du machst das.
  • Mach nichts anderes, bis das Wort DONE auf dem Whiteboard steht.
  • Gehen Sie zurück zu Ihrem Schreibtisch und warten Sie, bis die nächste Aufgabe im Posteingang eintrifft.

Dieser Workflow verhindert, dass Sie die Arbeit erledigen, da die letzten beiden Schritte in der falschen Reihenfolge sind.

Szenario zwei: Sie sitzen an Ihrem Schreibtisch. Es gibt einen Posteingang. Es ist leer. Plötzlich erscheint ein Stück Papier in Ihrem Posteingang und beschreibt eine Aufgabe. Du springst auf die Füße und rennst herum und machst die Aufgabe. Aber was ist die Aufgabe? Es sagt Folgendes zu tun:

  • Ändern Sie das Whiteboard, um "running" zu sagen - OK, Sie tun das.
  • Gebt Debbie in der nächsten Kabine dieses andere Blatt Papier. OK, das machst du.
  • Mach nichts, bis dir jemand sagt, dass die Unteraufgabe FERTIG ist.
  • Wenn das passiert, schreib das Wort DONE auf dein Whiteboard.
  • Geh zurück zu deinem Schreibtisch.

Was sagt Debbie zu dem Blatt Papier? Es sagt:

  • Stellen Sie Ihren Wecker für eine Stunde später ein. OK, sie macht das.
  • Wenn der Wecker klingelt, lege ein Stück Papier in deinen Posteingang und sag Middas, dass du fertig bist.

Dieser Arbeitsablauf ist immer noch schrecklich darin, dass (1) Sie nichts tun, während Sie auf Debbies Wecker warten, und (2) Sie die Zeit von zwei Arbeitern verschwenden, wenn Du könntest einen einzigen Arbeiter haben, der all die Arbeit macht. Arbeiter sind teuer.

Aber dieser Workflow hindert Sie nicht daran, Arbeit zu erledigen eventuell . Es blockiert nicht, weil Sie nicht auf Arbeit warten, die Sie selbst in Zukunft tun werden , Sie warten auf jemand anderen , um die Arbeit zu erledigen.

(Ich stelle fest, dass dies keine exakte Analogie für das ist, was in Ihrem Programm passiert, aber es ist nahe genug, um die Idee zu vermitteln.)

    
Eric Lippert 28.07.2016 17:31
quelle

Tags und Links