在客户端和服务中应用异步等待之间的区别
我已经创建了一个WCF服务,并且它的操作包含和实现如下:
[OperationContract] Task GetName(string name); public async Task GetName(string name) { await Task.Delay(5000); var task1 = Task.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,它有什么优势吗?
请指导。
我不知道WCF生成的代码是什么样的,但我希望第二种forms更好。 (编辑:阅读斯蒂芬的博客文章 ,了解为什么这是真的。)
第一种方法创建了一个新任务,它同步调用该方法 – 只要方法返回就阻塞一个线程。 因此,如果你同时有很多这些调用,你最终会使用很multithreading,因此会占用内存。
我希望第二种方法更“本机”异步 – 基本上发送请求,然后在它返回时在可能不同的线程上处理响应。
对于你的最终问题:
对于我在两个地方(clien-server)使用async-await的第二个调用,它有什么优势吗?
你在两个片段中的两个地方使用await
。 但是,在两个地方使用异步代码肯定有一个优势。 在客户端中,您正在保存客户端线程。 在服务器中,您将保存服务器线程。
使用纯异步版本,您可以从客户端到服务器进行数百次调用,而不必在每个进程中使用多于一个或两个线程。 在客户端中,您没有阻止任何内容,等待响应 – 您只需在响应通过时准备好继续调用。 在服务器中,你没有在Thread.Sleep
调用上阻塞任何东西(与Task.Delay
相当的逻辑同步) – 你只需要在延迟到期时准备好运行很多延续。
所以,是的,每一方都很好。 基本上,无论你在哪里使用它,都能获得好处。
- 使用WCF的IQueryable问题
- 有效关闭WCF 4通道的正确方法
- 使用SelfHosting时,我可以自动托管app.config中的所有服务吗?
- WCF:EncryptedKey子句未包含所需的加密令牌’System.IdentityModel.Tokens.X509SecurityToken’
- REST服务上的错误请求错误使用POST(json数据)调用方法?
- 响应消息的内容类型application / xml; charset = utf-8与绑定的内容类型不匹配(text / xml; charset = utf-8)
- 使用自定义ClientCredentials的WCF身份validation:要使用的clientCredentialType是什么?
- 您将如何在WCF数据服务中实现API密钥?
- 如何处理WCF客户端断开连接