Diese Frage betrifft die C # -Sprache, aber ich erwarte, dass sie andere Sprachen wie Java oder TypeScript abdeckt.
Microsoft empfiehlt Best Practices für die Verwendung asynchroner Aufrufe in .NET. Wählen wir unter diesen Empfehlungen zwei aus:
- Ändern Sie die Signatur der asynchronen Methoden so, dass sie Task oder Task <> zurückgeben (in TypeScript wäre das ein Versprechen <>).
- ändere die Namen der asynchronen Methoden so, dass sie mit xxxAsync () enden
Wenn Sie nun eine synchrone Komponente auf niedriger Ebene durch eine asynchrone Komponente ersetzen, wirkt sich dies auf den gesamten Stapel der Anwendung aus. Da sich async / await nur dann positiv auswirkt, wenn es "ganz nach oben" verwendet wird, müssen die Signatur und die Methodennamen aller Ebenen in der Anwendung geändert werden.
Eine gute Architektur beinhaltet häufig das Platzieren von Abstraktionen zwischen den einzelnen Ebenen, sodass das Ersetzen von Komponenten auf niedriger Ebene durch andere von den Komponenten auf höherer Ebene nicht gesehen wird. In C # haben Abstraktionen die Form von Schnittstellen. Wenn wir eine neue asynchrone Komponente auf niedriger Ebene einführen, muss jede Schnittstelle im Aufrufstapel entweder geändert oder durch eine neue Schnittstelle ersetzt werden. Die Art und Weise, wie ein Problem in einer implementierenden Klasse gelöst wird (asynchron oder synchron), ist für die Aufrufer nicht mehr verborgen (abstrahiert). Die Anrufer müssen wissen, ob es synchron oder asynchron ist.
Sind nicht asynchrone / erwartete Best Practices, die im Widerspruch zu den Prinzipien der "guten Architektur" stehen?
Bedeutet dies, dass jede Schnittstelle (z. B. IEnumerable, IDataAccessLayer) ihr asynchrones Gegenstück (IAsyncEnumerable, IAsyncDataAccessLayer) benötigt, damit sie beim Wechsel zu asynchronen Abhängigkeiten im Stapel ersetzt werden können?
Wenn wir das Problem ein wenig weiter schieben, wäre es nicht einfacher anzunehmen, dass jede Methode asynchron ist (um eine Aufgabe <> oder eine Zusage <> zurückzugeben), und dass die Methoden die asynchronen Aufrufe synchronisieren, wenn sie nicht tatsächlich sind asynchron? Ist das von den zukünftigen Programmiersprachen zu erwarten?
CancellationToken
, und diejenigen, die dies tun, möchten möglicherweise eine Standardmethode angeben). Das Entfernen der vorhandenen Synchronisierungsmethoden (und das proaktive Brechen des gesamten Codes) ist ein offensichtlicher Nichtstarter.