3

私はWCFサービスを作成し、その操作契約と実装を次のようにしています。

    [OperationContract]
    Task<string> GetName(string name);

   public async Task<string> GetName(string name)
    {
         await Task.Delay(5000);
         var task1 = Task<string>.Factory.StartNew(() =>
         {
             return "Your name is : " + name;
         });
         var result = await task1;
         return result;
        }

今、私はクライアント側でこのサービスを使用していて、クライアントを作成しました。

 ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();

それは私の実装のための2つのメソッドを示しています:GetNameとGetNameAsync

サービスにアクセスするには、次の2つの方法を使用できます。

var result_GetName = await Task.Factory.StartNew(() => client.GetName("My Input"));
 var result_GetNameAsync = await client.GetNameAsync("My Input");
  • Q.1 2つのアプローチに違いはありますか?
  • Q.2特定の条件で使用することをお勧めしますか?または私はいつでもそれらのいずれかを使用することができます。
  • Q.3 2つの場所(クライアントサーバー)でasync-awaitを使用している2番目の呼び出しには、何か利点がありますか?

ご案内ください。

4

1 に答える 1

8

生成されたコードがWCFでどのように表示されるかはわかりませんが 2番目の形式の方が優れていると思います。(編集:これが真実である理由の詳細については、Stephenのブログ投稿を読んでください。)

最初のアプローチでは、メソッドを同期的に呼び出す新しいタスクを作成します。メソッドが戻るまでの間、スレッドをブロックします。したがって、これらの呼び出しが同時に多数ある場合は、多くのスレッドを使用することになり、したがってメモリを使用することになります。

2番目のアプローチは、より「ネイティブに」非同期であると思います。基本的には、リクエストを送信し、戻ってきたときに異なる可能性のあるスレッドでレスポンスを処理します

最後の質問:

2つの場所(clien-server)でasync-awaitを使用している2番目の呼び出しでは、それの利点はありますか?

両方のスニペットawaitの2か所で使用しています。しかし、はい、両方の場所で非同期コードを使用することには間違いなく利点があります。クライアントでは、クライアントスレッドを保存しています。サーバーでは、サーバースレッドを保存しています。

純粋に非同期バージョンを使用すると、これらの各プロセスで1つまたは2つ以上のスレッドを使用せずに、クライアントからサーバーへの数百の呼び出しを行うことができます。クライアントでは、応答を待って何もブロックされていません。応答が届いたときに継続を呼び出す準備ができているだけです。サーバーでは、呼び出しでブロックされるものは何もありませんThread.Sleep(論理的に同期するのと同等ですTask.Delay)。遅延が期限切れになったときに、実行できる継続がたくさんあります。

そうです、それはどちらの側でも良いことです。基本的に、どこで使用してもメリットがあります。

于 2012-09-28T06:23:49.070 に答える