8

私は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 を返す意味はありますか?

4

2 に答える 2

0

まず、問題が実際に非同期呼び出しであることを確認する必要があります。サービスを同期的に呼び出して、呼び出しが成功するかどうかを確認してください。

問題が実際に非同期操作であると仮定すると、これは WCF で非同期操作を処理するデフォルトの方法であるため、IAsyncResult代わりにWCF を使用する必要があります。asyncサービスを開始するための操作と、結果を処理するための別の操作が必要になります。

私はいくつかのコードを書くことができましたが、ここに私のポイントを詳細に説明し、読む価値のあるいくつかの良い投稿があります:

別のヒント:

これらの手順を実行した後、クライアントが非同期実行を処理するためにさらに時間が必要であることに気付いた場合は、 を増やしてoperation timeout、戻りをより長く待機できるようにすることを検討してください。接続が不安定な場合は、 を増やしてopen timeout、クライアントが接続を確立するためにより多くの時間を与えることを検討してください。

それが役に立てば幸い。

于 2013-07-25T10:54:27.710 に答える