2017-05-05 4 views
0

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 und GetSomething Anrufe gleich behandelt werden? Also, wenn (IsOneWay = true) notwendig ist, kann es auch auf die GetSomething Methoden verwendet werden?

Antwort

0

Wenn der Service ist eine Möglichkeit oder nicht hat nichts mit der Technologie des Clients zu tun. In der Semantik der C# -Methode bedeutet dies nur, dass es sich um eine void Rückgabe-Methode handelt.

Jetzt, wenn der Client in .NET implementiert ist und der Benutzer wählt, um es auf eine blockierende Weise oder nicht zu benennen, ist es seine/ihre Wahl.

Vor der Einführung von TAP (Task Asynchronous Patter) gab es APM (Asynchronous Programming Model) und EAP (Event-based Asynchronous Pattern) - wenn ich mich richtig erinnere, WCF EAP verwendet.

Verwandte Themen