当前位置: 首页 > 编程语言 > C#

为什么非要用await方法才能异步运行,如果我不想在继续之前等待方法完成怎么办?分享

时间:2023-04-10 15:44:25 C#

为什么我必须使用await方法异步运行。如果我不想在继续之前等待方法完成怎么办?我整天都在听MSDN文档,他们的异步编码哲学让我很困惑。据我了解,如果调用异步方法,调用异步方法的线程不会被阻塞。然而,async总是与await配对,这似乎否定了async-ness,使得外部方法无论如何都必须等待代码执行。我不应该能够调用异步方法然后继续使用外部方法吗?这是我遇到过的场景,或多或少:voidreportSomethingHappened(info)-收集信息-HTTPPOST信息到日志服务器(即mixpanel,sentry)这将是一个调用方法:voidlargerProcessif(whatever)reportSomethingHappened();布拉;布拉;据我所知,由于POST请求可以异步完成,我应该能够将reportSomethingHappened()转换为异步方法(通过AFAIK,等待webrequest,并添加async关键字)。但是largeProcess方法不需要等待(即等待)报告方法完成才能执行blabla。但是,VS告诉我,使用异步方法,我可以等待它,或者它会同步发生,然后阻塞。这不是破坏了它的目的吗?我该如何编写,以便reportSomethingHappened不会阻止greaterProcess的执行?(这本身就让我感到困惑,因为我认为这就是异步的全部意义所在)如果您调用异步方法,无论您是否等待返回的任务,它都会异步运行。await不会影响方法的执行方式,只会影响调用者如何处理它。您可以调用异步方法,获取任务并立即等待它(这是最简单的选择)。这将允许您编写看起来同步但异步运行的代码,因为await基本上将其余代码注册为它背后的回调,它仅在等待的任务完成时执行。传统上这不会阻塞,因为没有线程被阻塞,但代码流将是顺序的:asyncTaskLargerProcessAsync(){if(condition){awaitReportSomethingHappenedAsync();}//做其他事情}但是,您不一定非得这样做。您可以恢复任务、执行其他任务并等待它:asyncTaskLargerProcessAsync(){Tasktask=null;如果(条件){task=ReportSomethingHappenedAsync();}//做其他事情if(task!=null){awaittask;或者您可以完全删除await。您应该意识到这可能很危险,因为任务可能会出现故障并且可能无法观察到异常,这就是不鼓励这样做的原因。有几种方法可以做到这一点,但它们并不简单。您可以使用Task.ContinueWith:voidLargerProcess(){if(condition){ReportSomethingHappenedAsync().ContinueWith(task=>{try{task.Wait();}catch(Exception异常){//处理异常}})}//做其他事情}或者对于ASP.Net,查看ASP.NET上的FireandForgetC#学习教程就是这样:为什么我必须使用await方法来异步运行。如果我不想在继续之前等待方法完成怎么办?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: