Lea*_*ner 3 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;
}
Run Code Online (Sandbox Code Playgroud)
现在我在客户端使用此服务并创建了客户端.
ServiceReference1.Service1Client client = new ServiceReference1.Service1Client();
Run Code Online (Sandbox Code Playgroud)
它显示了我的实现的两种方法:GetName和GetNameAsync
我可以使用以下两种方式来访问该服务.
var result_GetName = await Task.Factory.StartNew(() => client.GetName("My Input"));
var result_GetNameAsync = await client.GetNameAsync("My Input");
Run Code Online (Sandbox Code Playgroud)
请指导.
我不知道生成的代码是什么样子的WCF,但我希望的第二种形式更好.(编辑:阅读斯蒂芬的博客文章,了解为什么这是真的.)
第一种方法创建一个新任务,它同步调用该方法- 只要方法返回就阻塞一个线程.因此,如果你同时有很多这些调用,你最终会使用很多线程,因此会使用内存.
我想到了第二种方法要更加"原生地"异步-基本上发送请求,然后处理上出现了不同的线程响应,当它回来.
对于你的最终问题:
对于我在两个地方(clien-server)使用async-await的第二个调用,它有什么优势吗?
你await在两个片段中的两个地方使用.但是,在两个地方使用异步代码肯定有一个优势.在客户端,您正在保存客户端线程.在服务器中,您将保存服务器线程.
使用纯异步版本,您可以从客户端到服务器进行数百次调用,而不会在每个进程中使用多于一个或两个线程.在客户端中,您没有阻止任何内容,等待响应 - 您只需在响应通过时准备好继续调用.在服务器中,您没有阻止任何Thread.Sleep呼叫(逻辑同步等效Task.Delay) - 您只需要在延迟到期时准备好运行许多延续.
所以,是的,每一方都很好.基本上,无论你在哪里使用它,都能获得好处.
| 归档时间: |
|
| 查看次数: |
706 次 |
| 最近记录: |