C# 在客户机和服务上应用异步等待的区别

C# 在客户机和服务上应用异步等待的区别,c#,wcf,async-await,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(()

我创建了一个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;
        }
它为我的实现显示了两种方法:GetName和GetNameAsync

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

var result_GetName = await Task.Factory.StartNew(() => client.GetName("My Input"));
 var result_GetNameAsync = await client.GetNameAsync("My Input");
  • 问题1.这两种方法之间有什么区别吗
  • Q.2是否建议在特殊情况下使用其中一种?或者我可以随时使用它们中的任何一个
  • 对于我在两个位置(客户机-服务器)使用的第二个调用async Wait,它有什么优势吗

请指导。

我不知道生成的WCF代码是什么样子的,但我希望第二种形式会更好。(编辑:请阅读以了解其真实原因的详细信息。)

第一种方法创建一个同步调用方法的新任务——阻塞线程,直到方法返回为止。因此,如果您同时有很多这样的调用,那么最终将使用大量的线程和内存

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

关于最后一个问题:

对于我正在使用的第二个调用async await at at two Place(clien服务器),它有什么优势吗

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

使用纯异步版本,您可以有数百个从客户端到服务器的调用,而无需在每个进程中使用一个或两个以上的线程。在客户机中,没有任何东西被阻塞,等待响应——只有continuations可以在响应通过时被调用。在服务器中,在
线程.Sleep
调用(与
任务.Delay
的逻辑同步等价物)上没有任何阻塞-延迟到期时,您只需要准备好大量的continuations即可运行


是的,两边都很好。基本上,无论你在哪里使用它,你都会得到好处。

非常感谢Jon。我知道使用异步等待的响应优势。您的回答清楚地解释了可伸缩性优势。在客户端和服务器端使用asycn将使用最少的资源。再次感谢您的回复。客户端代理上新的
*Async
方法是“本机异步”的。我在网上写了一篇博文。@StephenCleary:谢谢你的确认。这很有道理。@Jon Skeet:请评论一下这个问题,因为我已经把我从你的答案中理解的东西放在一起了。
var result_GetName = await Task.Factory.StartNew(() => client.GetName("My Input"));
 var result_GetNameAsync = await client.GetNameAsync("My Input");