Wie kann ich feststellen, ob eine C# - Methode ist async/await per reflection?
z.B.
class Foo { public async Task Bar() { await Task.Delay(500); } }
Wenn wir reflektieren über diese Klasse und Methode, wie kann ich ermitteln, ob dies eine tatsächliche async/await-Methode, anstatt einfach eine Methode, die geschieht, um wieder eine Aufgabe?
class Foo { public Task Bar() { return Task.Delay(500); } }
- Am Ende des Tages, warum ist es wichtig für Sie?
async
ist eine Implementierung detail von der Methode, und sollte veränderbar sein, ohne die Verbraucher sorgen. - Da Schreibe ich ein IoC-interceptor, die versucht zu verfolgen, die Beginn und Ende des Aufrufs einer Methode.
- Aber wenn man bedenkt, dass ein
async
Methode ist nicht wirklich "komplett", bis die Aufgabe, die es gibt abgeschlossen ist, warum sollten Sie nicht auch von einer Methode, gibt einenTask
als unvollständig, bis die Aufgabe abgeschlossen ist? Beachten Sie auch, dass ein nicht-async-Methode zurückgebenTask
tun können, ein paar einfache Dinge selbst und dann stellen Sie den Großteil Ihrer Arbeit an eineasync
interne Methode, und übergeben Sie zurück an den Aufrufer derTask
erstellt, dass die Methode - Sie planen, um zu versuchen zu erkennen, wie eine situation? - Der springende Punkt ist, dass ich unterscheiden wollen zwischen solche Methoden. Eine Methode, der job kann einen Task erstellen und zurückgeben, die wieder zu nennen, im Gegensatz zu einigen Verfahren, die Durchführung einige arbeiten und dabei einen warten drin.
- Aber der ganze Punkt, den ich versuche zu machen ist, dass dies ist eine willkürliche Unterscheidung, die Sie gerade zeichnen. Zwei Klassen implementieren die gleiche Schnittstelle. Man kann wählen, zu verwenden
async
, die anderen können wählen, es nicht zu tun. Beide erfüllen den gleichen Vertrag, also warum sollte Sie anders behandelt werden? Und 6 Monate später, eine oder beide dieser Klassen gehabt haben können, deren Implementierungen sich verändert und Hinzugefügt oder entfernt dieasync
Stichwort - aber es ändert nichts an der vertraglichen Verhalten, dass Sie uns zur Verfügung stellen. - Es hat den Vertrag ändern - mit einer async-Methode, Sie muss nicht explizit zurückgeben Aufgabe, so gibt es ein Verständnis gibt, dass mit einer Async-Methode Sie haben etwas geschehen "implizit". Die anderen, Sie sind ausdrücklich Rückkehr eine Aufgabe - meiner Meinung nach ist der Vertrag, die Methode ist "eine Aufgabe Erstellen, starten Sie es und schicken Sie es zurück".
- Eine interface-Methode kann nicht dekoriert werden mit
async
. Und doch-Entwickler können wählen, ob oder nicht, Ihre Umsetzung istasync
oder nicht - Sie sind beide erfüllen den gleichen Vertrag (und dem Vertrag darf nicht dieasync
Modifikator). Deshalb, alle zusammen, ich habe gesagt, dass es ein implemenetation detail - es sollte keine Rolle spielen, auf externen code. - Außer wir markieren die konkrete Methode, die das Attribut für die Protokollierung, keine Schnittstelle. Lassen Sie uns darüber einig, uneinig zu sein hier.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In meiner Kopie des Codes, der
MethodInfo
für dieasync
- Methode enthält die folgenden Elemente in derCustomAttributes
Eigenschaft:DebuggerStepThroughAttribute
AsyncStateMachineAttribute
in der Erwägung, dass die
MethodInfo
für die normale Methode enthält keine Elemente in seinenCustomAttributes
Eigenschaft.Scheint es, wie die
AsyncStateMachineAttribute
sollte zuverlässig gefunden aufasync
- Methode und nicht auf einem normalen.Edit: In der Tat, diese Seite hat auch den folgenden in den Beispielen!
null
nicht werfen, obwohl du Recht hast, dass es nicht notwendig ist. Es ist nur ordentlich zu casten auf den Typ an, Sie haben gerade gefragt. Die generische version gar nicht die Zeit, diese zu beantworten.Task Func2() => Func1();
Stil leitet.Damien_The_Unbeliever warf eine interessante Herausforderung. Ich denke, die überprüfung für
AsyncStateMachineAttribute
ist keine ausreichende Lösung. Die ursprüngliche Frage sollte nicht sein, ob die Methode async. Stattdessen sollte es sein, ob es erwartbaren. Beide Methode werden Proben in Damiens Antwort-gibt true zurück, wenn Sie prüfen, ob die MethodeGetAwaiter()
auf den Rückgabetyp. Jedoch nur die Methode markiertasync
gehören dieAsyncStateMachineAttribute
in den benutzerdefinierten Attributen der Sammlung.Wissen, ob die Methode ist erwartbaren ist wichtig, wenn Sie verwenden möchten
MethodInfo.Invoke()
um die Methode aufrufen, und Sie nicht wissen, vor der Zeit, wenn Methoden, die möglicherweise registriert werden, um eine message broker zum Beispiel, sind erwartbaren.BEARBEITEN:
Gute Idee, überprüfen Sie den Rückgabetyp auf MethodInfo. Dies ist meine überarbeitete code.
async
.Hier ist ein Beispiel für zwei Methoden, und ich Frage Sie, warum Sie denken, dass Sie anders behandelt werden:
Beide haben innerhalb einer handwave, die exakt gleiche Laufzeitverhalten - für 20 Sekunden sind Sie nichts tun (und nicht-festhalten-thread während dieser Zeit) und dann führen Sie ein kleines delegieren, passt einfach wieder den Wert zunächst an die Methode übergeben.
Und doch, Sie gehen zu behandeln, ein gewaltig anders als die anderen, weil ich wählen, um die compiler zu verstecken einige der Sanitär -?
async
.)async
Methode ist dabei in Bezug auf die Planer, es sei denn, Sie möchten, zu dekompilieren der eigentliche code der Methode.