使用 async/await 进行异步编程
Posted
技术标签:
【中文标题】使用 async/await 进行异步编程【英文标题】:Asynchronous programming using async/await 【发布时间】:2016-12-04 20:43:43 【问题描述】:我很难理解异步/等待。假设我有一个 A 类和 B 类。A 类从 wcf 服务方法返回一个 ActionResult。在此之前,它使用 await 从另一个类调用异步方法。这是否意味着 await obj.method(param1)
将异步运行,无需等待其执行完成, wcfservice 方法就会执行?还是等到完成?
我希望 somemethod() 应该继续执行而不等待 classB 中方法的结果。我将如何实现这一目标?
public async classA
public async IHttpActionResult somemethod
classB obj = new classB();
await obj.method(param1);
returnok(somewcfservice.method());
public classB
public async Task method(param)
obj.somebuiltinmethod(param)
【问题讨论】:
您发布的代码无效。somemethod()
不能使用 await
而不是 async
。这个问题也很广泛。 Stack Overflow 不是一个教程网站。你应该研究语言特征。如果您仍有疑问,请具体并确保说明您已经完成了哪些研究。如果您希望somemethod()
无需等待即可正常完成,请不要等待(即不要使用await
)。
【参考方案1】:
1.这是否意味着 await obj.method(param1) 将异步运行并且无需等待其执行完成, wcfservice 方法将执行?还是等到完成?
await obj.method(param1); 将等待 obj.method 完成执行,然后再恢复执行流程。这意味着 obj.method(param1); 完成,然后将调用 Web 服务方法。
2.我希望 somemethod() 应该继续执行而不等待 classB 中方法的结果。我怎样才能做到这一点?
你可以这样做:
var task = obj.method(param1);
var result = somewcfservice.method()
Task.WaitAll(task);
returnok(result);
【讨论】:
"await obj.method(param1); 将等到 obj.method 完成" -- 不,它不会。它只会编译失败,因为somemethod()
不是async
方法。 “你可以这样做:” -- 不,这似乎与他所要求的相反。您的示例将阻塞线程,直到任务完成。他特别要求somemethod()
方法继续执行(并可能返回)“无需等待”(他的话)。
@PeterDuniho 我同意代码不能编译,但我认为他很快就会意识到。好吧,只是创建一个任务而不是等待运行,这超出了我的想象!以上是关于使用 async/await 进行异步编程的主要内容,如果未能解决你的问题,请参考以下文章
异步编程之Async,Await和ConfigureAwait的关系
温故知新,CSharp遇见异步编程(Async/Await),聊聊异步编程最佳做法