2016-06-16 8 views
0

Einfache Frage: Gibt es Richtlinien, die entweder von Microsoft selbst veröffentlicht wurden oder eine gängige Praxis in Bezug auf die Deklaration von Aufgaben für Typ- und Schnittstellenverträge sind?Aufgaben zu Typ-/Schnittstellenverträgen - Richtlinien?

Bisher habe ich viele verschiedene Ansätze gesehen:

Synchrone und asynchrone TAP mit (die meisten .NET-Typen):

void DoSomething(); 
Task DoSomethingAsync(); 

TAP nur:

Task DoSomething(); // notice, no 'Async' member naming 

Split Verträge :

interface IDoSomething { 

} 

interface IDoSomethingSync : IDoSomething { 
    void DoSomething(); 
} 

interface IDoSomethingAsync: IDoSomething { 
    Task DoSomething(); 
} 

... oder schließlich, einfach einen Vertrag ohne irgendwelche Aufgaben zu machen und es dem Verbraucher zu überlassen.

Gibt es eine offizielle Möglichkeit, dies zu deklarieren? Für eine Weile habe ich mich an das erste Beispiel gehalten, da es das gebräuchlichste im .NET-Framework ist, aber selbst dort ist es aus alten Gründen manchmal nicht konsistent.

+1

Eine solche Frage ist off-topic entweder als Suche nach Offsite-Ressourcen oder auf meinungsbezogenen Informationen. Es wird auch schon oft gefragt - ich denke, Duplikate sind gut genug, Grund zu schließen, aber zögern Sie nicht zu kommentieren, warum Frage sollte von selbst geschlossen werden. –

+0

@AlexeiLevenkov Ich habe eine Suche vor dem Posten der Frage, aber nichts nützliches kam auf. Außerdem sollte dies nicht optionsbasiert sein, da ich ausdrücklich nach einer Richtlinie (vorzugsweise von Microsoft selbst) frage, also gibt es entweder eine, die ich nicht finden konnte oder keine. Ich glaube nicht, dass die Frage, die Sie verlinkt/markiert haben, ein Duplikat ist, weil das OP dort nach Namenskonventionen fragt, nicht nach allgemeinen Richtlinien für das Interface-Design. – artganify

+0

artganify behauptet, dass diese Frage Suche nach Anleitung und nicht Duplikat von http://stackoverflow.com/questions/24766651/interface-naming-convention-for-method-returning-task - wieder geöffnet (wahrscheinlich nicht für lange). –

Antwort

3

Zunächst einmal enden TAP-Namenskonventionen immer in Async. Es gibt einige Ausnahmen von dieser Regel, hauptsächlich auf dem Task Typ.

Die erste Frage, die Sie beantworten müssen, ist: Ist dies eine Operation, die I/O enthält? (Oder, für Schnittstellen, ist dies eine Operation, die wahrscheinlich wird eine asynchrone Implementierung haben?) Wenn ja, dann sollte die Methode eine asynchrone Signatur haben.

Normalerweise müssen synchrone Signaturen nicht zusammengefügt werden, es sei denn, Sie benötigen sie aus Gründen der Abwärtskompatibilität. Beachten Sie, dass die meisten der Desktop-.NET-APIs sowohl die synchrone als auch die asynchrone Version für die Abwärtskompatibilität enthalten; Die neueren Typen (z. B. UWP, .NET Core) haben nur asynchron (für E/A-Vorgänge).

Stephen Toub schrieb ein paar klassische Blog-Beiträge Should I expose synchronous wrappers for asynchronous methods? und Should I expose asynchronous wrappers for synchronous methods?. Spoiler Alert: Die Antwort auf beide ist "Nein".

+0

Sehr interessante Artikel, die beide sehr sinnvoll sind, wenn Sync mit Async und umgekehrt synchronisiert wird. Das einzige, was mir noch unklar ist, ist die Aussage, die Sie bezüglich der Schnittstellen gemacht haben: "Ist das eine Operation, die wahrscheinlich eine asynchrone Implementierung haben wird?" Können wir das sicher wissen? Domänenbezogene Repositories sollten zum Beispiel niemals Features aus ihrer Infrastrukturimplementierung und In-Memory-Repositories (zu Testzwecken) offenbaren, die keine ressourcenintensive IO benötigen. Wäre es nicht besser, die Tatsache zu verbergen, dass Operationen möglicherweise asynchron ausgeführt werden? – artganify

+0

@artganify: Es ist das gleiche Designproblem wie IDisposable. Wie kann eine Schnittstelle wissen, ob * irgendwelche * ihrer Implementierungen entsorgt werden müssen? Sowohl Beseitigung als auch Asynchronität könnten als Implementierungsdetails in einer idealen Welt behandelt werden; aber es ist nicht möglich auf C# /. NET. –

+0

Daran habe ich nie gedacht, interessant. Das kann aber auch dadurch gelöst werden, dass eine Eigenschaft offengelegt wird, die dem Verbraucher mitteilt, ob die Implementierung entsorgt werden muss, genauso wie ICollection für Instanzen ein "IsReadOnly" hat. – artganify