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 einen Task als unvollständig, bis die Aufgabe abgeschlossen ist? Beachten Sie auch, dass ein nicht-async-Methode zurückgeben Task tun können, ein paar einfache Dinge selbst und dann stellen Sie den Großteil Ihrer Arbeit an eine async interne Methode, und übergeben Sie zurück an den Aufrufer der Task 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 die async 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 ist async oder nicht - Sie sind beide erfüllen den gleichen Vertrag (und dem Vertrag darf nicht die async 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.

Schreibe einen Kommentar