Ich bin neu in WCF. Ich mache einen Dienst, in dem ich eine langwierige Operation berechnen muss. Da die Methode lang ist, dachte ich, ich könnte die Operation async machen, indem ich eine Aufgabe zurücksende. Aber es funktioniert nicht. Ich bekomme immer noch eine Timeout-Ausnahme. Beispielcode (nicht meine eigentliche Code) zeigt mein Problem unter:WCF ServiceContract Methode, die Aufgabe <T> zurückgibt und Timeout
[ServiceContract]
public interface ICalculator
{
[OperationContract]
Task<double> ComputePiAsync(ulong numDecimals);
}
internal class Calculator : ICalculator
{
public async Task<double> ComputePiAsync(ulong numDecimals)
{
return await SomeVeryVeryLongWayOfComputingPi(numDecimals);
}
}
// server
using (var host = new ServiceHost(typeof(Calculator), new Uri("net.pipe://localhost")))
{
host.AddServiceEndpoint(typeof(ICalculator), new NetNamedPipeBinding(), "Calculator");
host.Open();
Console.WriteLine("Service is running. Press <ENTER> to exit.");
Console.ReadLine();
host.Close();
}
// client
var factory = new ChannelFactory<ICalculator>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/Calculator"));
var calculator = factory.CreateChannel();
await calculator.ComputePiAsync(numDecimals); // <--- this call takes longer than 1 minute and I'm getting a timeout here.
Also, was soll ich tun, um eine langwierige Operation an meinem Dienst zu rufen und asynchron auf das Ergebnis warten? Timeout erhöhen? Wenn ich das Zeitlimit für Vorgänge heraufsetze, was bringt es dann, wenn die Methode eine Aufgabe zurückgibt?
+1. Um auf den letzten Punkt hinzuweisen, kehrt 'async' auf der Serverseite nicht * früher zum Client * zurück. Die Antwort wird erst an den Client gesendet, wenn die zurückgegebene Aufgabe abgeschlossen ist. –
@ StephenCleary: Danke. Ja, Service-Seite Async/Warte-Asynchronität ist für den Client nicht sichtbar. – YK1
Wertvolle Frage und gute, klare Antwort. Wenn der Anruf lange dauert, weil die Operation am Dienst viel Rechenzeit erfordert, bin ich mir nicht sicher, ob ich darauf verweisen würde, was zu einem Netzwerk-Timeout führen würde. Ich stelle mir vor, diese beziehen sich auf Senden/Empfangen Timeouts, während eine Operation Timeout bezieht sich auf diese + Rechenzeit? –