2017-04-23 1 views
0

Meine WCF wie folgt aussieht:Asynchronous WCF auf dem Server, erhalten einige Anrufe verloren

public interface IIO 
{ 
    [OperationContract] 
    string Method1(string Data, Identity ID); 

    [OperationContract] 
    string Method2(string Data, Identity ID); 
    . 
    . 
    . 
    [OperationContract] 
    Task<int> Async1(string Data, Identity ID); 

    [OperationContract] 
    Task<int> Async2(string Data, Identity ID); 

} 

Dies ist die Implementierung von Async1 auf dem Server:

public async Task<int> Async1(string Data, Identity ID) 
    { 
     var myTask = Task.Factory.StartNew(() => InternalAsync1(Data, ID)); 
     var result = await myTask; 
     return result; 
    } 

Client-Seite funktioniert wie folgt: Ich habe die Proxy-Instanz, sobald sie erstellt wurde, um für die Lebensdauer des Clients verwendet zu werden, verwenden Sie anschließend Methoden nacheinander. Am Anfang dachte ich, er die Proxy-Instanz für einige Sekunden halten wird einige Zeit für die Wiederverbindung speichern, oder ich kann falsch sein ...

GlobalInstance_of_ServiceReference.Async1(data, ID); 
//No waiting for operation to finish, it may take a long time... 
Environmen.Exit(0); 
//Appdomain will get destroyed by mother application after this 

Nach jeder der Async Aufgaben ausführt, wird Kunden von Appdomain entladen . Der Client wartet nicht darauf, dass die asynchrone Operation beendet wird. Dies kann eine lange laufende Aufgabe auf dem Server sein.

Async-Methoden geben tatsächlich void zurück oder geben hier einen Dummy 0 zurück, der das Format der Task <> erfüllt.

Warum brauche ich sie async auf der Serverseite? Weil ich einfach möchte, dass die Anfrage auf dem Server fortgesetzt wird, nachdem der Client zerstört wurde. Ein anderes Szenario (clientseitig asynchron) würde auf dem Server enden, nachdem der Client entladen wurde, oder ich habe einen Fehler gemacht ...

Was ist das Problem jetzt? Einige der asynchronen Anforderungen (genau die letzte Anweisung auf dem Client vor dem Entladen des Clients, nach einigen anderen Synchronisierungsanforderungen an denselben Server) werden ohne Warnung nicht ausgeführt.

Jeder Rat über meine Architektur oder Techniken wird geschätzt.

Antwort

0

Edit:

1- Environment.Exit (0) wurde den Lauf Appdomain und die gesamten Prozess beendet wird. Ich habe die Konfiguration dieses Teils geändert. Das ist wichtig zu wissen: Environment.Exit beendet nicht nur die aktuelle Appdomain. Es beendet die gesamte Anwendung. Der Punkt ist, dass WCF intern von der gleichen Website aufgerufen wurde, also war diese Beendigung in der gesamten Anwendung fatal für die Fortsetzung des Laufens.

2- Ich habe meine Arbeitsverträge in "IsOneWay = true" geändert. Dies ist in der Implementierung einfacher als "async Task" Vorlage. Es gibt Ressourcen im Netz, die darauf hinweisen, dass One-Way-Operationen den Client blockieren können, bis sie ihre Anfrage auf der Server-Queue einfügen können. Das war schon was ich wollte. Ich wollte nicht, dass der Prozess fortfährt, ohne diese Aufgabe erfolgreich abzuschließen. Es war also kein Problem für mich.

Verwandte Themen