Jestem nowy w WCF. Wykonuję usługę, w której muszę obliczyć długą operację. Ponieważ metoda jest długa, pomyślałem, że mogę wykonać operację asynchroniczną, zwracając zadanie. Ale to nie działa. Nadal dostaję wyjątek Timeout. Przykładowy kod (nie mój rzeczywisty kod) wykazania mój problem poniżej:Metoda WCF ServiceContract powraca Zadanie <T> i limit czasu
[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.
Więc co należy zrobić, aby wywołać długie działanie na moją usługę i czekać na wynik asynchronicznie? Zwiększ limit czasu? Jeśli zwiększam limit czasu operacji, jaki jest sens, aby metoda zwróciła zadanie?
+1. Aby wyjaśnić na ostatnim punkcie, 'async' po stronie serwera nie zwraca * do klienta * wcześniej. Odpowiedź jest wysyłana do klienta dopiero po zakończeniu zwróconego zadania. –
@StephenCleary: Dzięki. Tak, asynchronizacja "async/await' po stronie usługi nie jest widoczna dla klienta. – YK1
Cenne pytanie i dobra, jasna odpowiedź. Jeśli wywołanie jest długotrwałe, ponieważ operacja wymaga dużej ilości czasu obliczeniowego, nie jestem pewien, czy odwołałbym się do niej, powodując przekroczenie limitu czasu sieci. Wyobrażam sobie, że odnoszą się one do wysyłania/odbierania limitów czasu, podczas gdy limit czasu operacji odnosi się do tych czasów + obliczeń? –