Ein WCF Vertrag könnte wie folgt aussehen:Sollten aufgabenbasierte WCF-Aufrufe OneWay sein?
[ServiceContract]
public interface IService
{
[OperationContract]
void DoSomethingFast();
[OperationContract]
void DoSomethingSlow();
[OperationContract]
int GetSomethingFast();
[OperationContract]
int GetSomethingSlow();
}
Wenn ein Client eine dieser Anrufe macht, seinen Thread blockiert, während der Server seine Sache tut. Für die Fast
Methoden ist das kein Problem, aber für die Slow
Methoden ist diese Blockierung bei weitem nicht ideal. Wir können (IsOneWay = true)
die DoSomething
Methoden hinzufügen, aber wir können das gleiche für die GetSomething
Methoden nicht tun, weil sie wirklich zwei Wege sind - wir habenfür das Ergebnis zu warten:
[ServiceContract]
public interface IService
{
[OperationContract(IsOneWay = true)]
void DoSomethingFast();
[OperationContract(IsOneWay = true)]
void DoSomethingSlow();
[OperationContract]
int GetSomething();
[OperationContract]
int GetSomethingSlow();
}
Geben Sie den Task- basierendes asynchrones Muster (TAP). Wir definieren den Vertrag zur Rückgabe Task
, und WCF (nach meinem besten Wissen), macht etwas Magie hinter den Kulissen und gibt sofort eine Task
zurück, die auf einen Rückruf vom WCF-Dienst wartet, bevor abgeschlossen. Dadurch entfällt die clientseitige Sperrung, die die Verwendung von await
statt:
[ServiceContract]
public interface IService
{
[OperationContract(IsOneWay = true)]
Task DoSomethingFastAsync();
[OperationContract(IsOneWay = true)]
Task DoSomethingSlowAsync();
[OperationContract]
Task<int> GetSomethingAsync();
[OperationContract]
Task<int> GetSomethingSlowAsync();
}
Meine Frage ist, wie das alles funktioniert, und ob Sie müssen noch (IsOneWay = true)
auf den Servicevertrag enthalten:
- Ist der nach meinem besten Wissen Bit über genau? Gibt WCF automatisch eine
Task
zurück, die abgeschlossen wird, wenn der Dienst uns mitteilt, dass sie beendet ist? - Ist
(IsOneWay = true)
notwendig, damit die obige Magie passiert? Wenn nicht, hat es überhaupt eine Wirkung? - Vorausgesetzt, dass der Rückruf vom Dienst kann "Ich bin fertig" oder "Hier ist Ihr Ergebnis" mit gleicher Leichtigkeit, können die
DoSomething
undGetSomething
Anrufe gleich behandelt werden? Also, wenn(IsOneWay = true)
notwendig ist, kann es auch auf dieGetSomething
Methoden verwendet werden?