使用 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 进行异步编程的主要内容,如果未能解决你的问题,请参考以下文章

NET 中的 async/await 异步编程

异步编程之Async,Await和ConfigureAwait的关系

温故知新,CSharp遇见异步编程(Async/Await),聊聊异步编程最佳做法

.NET Web应用中为什么要使用async/await异步编程

Async await 异步编程说明

async 和await