私はWCFが初めてです。時間のかかる操作を計算する必要があるサービスを作成しています。メソッドが長いので、タスクを返すことで操作を非同期にすることができると思いました。しかし、うまくいきません。まだタイムアウト例外が発生しています。以下の私の問題を示すサンプルコード(私の実際のコードではありません):
[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.
では、サービスで時間のかかる操作を呼び出して結果を非同期で待つにはどうすればよいでしょうか? タイムアウトを増やしますか? 操作のタイムアウトを増やした場合、メソッドに Task を返す意味はありますか?