在客户端和服务中应用async-await之间的区别

时间:2012-09-28 06:13:49

标签: c# wcf async-await

我已经创建了一个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();

它显示了我的实现的两种方法:GetName和GetNameAsync

我可以使用以下两种方式来访问该服务。

var result_GetName = await Task.Factory.StartNew(() => client.GetName("My Input"));
 var result_GetNameAsync = await client.GetNameAsync("My Input");
  • Q.1这两种方法有什么区别吗?
  • Q.2是否建议在特定条件下使用其中一种?或者我可以随时使用它们中的任何一种。
  • Q.3对于我在两个地方(客户端 - 服务器)使用async-await的第二个呼叫,它有什么优势吗?

请指导。

1 个答案:

答案 0 :(得分:8)

我不知道WCF生成的代码是什么样的,但是我希望期望第二种形式更好。 (编辑:阅读Stephen's blog post了解为什么会这样的详细信息。)

第一种方法创建一个新任务,它同步调用方法 - 只要方法返回就阻塞一个线程。因此,如果你同时有很多这样的调用,你最终会使用很多线程,因此会使用内存。

期望第二种方法更“本机”异步 - 基本上发送请求,然后在它返回时在可能不同的线程上处理响应。

关于你的最后一个问题:

  

对于我在两个地方(clien-server)使用async-await的第二个电话,它有什么优势吗?

您在两个片段中的两个位置使用await。但是,在两个地方使用异步代码肯定有一个优势。在客户端,您正在保存客户端线程。在服务器中,您将保存服务器线程。

使用纯粹的异步版本,您可以从客户端到服务器进行数百次调用,而不会在每个进程中使用多于一个或两个线程。在客户端中,您没有阻止任何内容,等待响应 - 您只需在响应通过时准备好继续调用。在服务器中,Thread.Sleep调用时没有阻塞任何内容(逻辑同步等效于Task.Delay) - 当延迟到期时,您只需准备好运行许多延续。

所以是的,每一方都很好。无论你在哪里使用它,基本上都能获得好处。