当前位置: 首页 > 知识库问答 >
问题:

不理解异步和等待

终弘厚
2023-03-14

我一直试图理解C#中的Async/await和Task,但尽管看了youtube视频,阅读了文档,并参加了pluralsight课程,但一直失败得很厉害。

我希望有人能帮助回答这些稍微抽象的问题,帮助我的大脑摆脱困境。

1.为什么说async/await启用了一个“Asynchonrous”方法,而async关键字本身什么也不做,而await关键字添加了一个挂起点?添加挂起点不是强制方法同步操作,即在继续前进之前完成await标记的任务。

public async Task SaveScreenshot(string filename, IWebDriver driver)
{
    var screenshot = driver.TakeScreenshot();
    await Task.Run(() =>
    {
        Thread.Sleep(2000);
        screenshot.SaveAsFile(filename, ScreenshotImageFormat.Bmp);
        Console.WriteLine("Screenshot saved");
    });
    Console.WriteLine("End of method");
}

任何帮助理解这一点将非常感谢。

共有1个答案

齐文林
2023-03-14

添加挂起点不是强制方法同步操作,即在继续前进之前完成await标记的任务。

不,你想到的是“顺序”,而不是“同步”。await导致异步顺序代码。“顺序”指“一次一个”;“同步”的意思是“阻止直到完成”。

通常如何调用异步方法?

 类似资料:
  • 但是,了解node.js事件循环会发现: 当然,在后端,有用于DB访问和进程执行的线程和进程。 在C#中,编写带有标记的函数和带有的调用就足够了,这样.NET就可以将它放在另一个线程中。但是,node.js中组织方式不同的东西让我很困惑,async/await函数仍然会阻塞主线程。

  • 我想使用异步并等待处理承诺。我想在下面的示例中使用这个方法: 在执行时,它给了我一个错误 错误: UnhandledPromiseRejectionWarning:未处理得承诺拒绝.这个错误可能是由于抛出一个没有catch块的异步函数内部,或者是由于拒绝了一个未用.catch()处理的承诺。(拒绝ID:3)

  • 我已经安装了babel-preset-es2017和babel-preset-env并更新了babelrc中的预置,但仍然给出了这个错误 是不是少了什么?

  • 该站点由一个托管在4节点集群上的API(WEB API)站点和一个托管在另一个4节点集群上并调用该API的WEB站点组成。两者都是使用ASP.NET MVC5开发的,所有操作/方法都基于async-await方法。 在一些监视工具(如NewRelic)下运行站点、调查几个转储文件并分析工作进程之后,结果发现,在负载非常轻的情况下(例如16个并发用户),我们最终拥有大约900个线程,使用了100%的

  • 我试着去理解promise。所有这些都在使用async Wait的映射函数中,但我似乎返回了挂起的promise,我不明白为什么 这是工作代码,当我有一个.然后解决我的promise 哪个日志与预期一致=[2,3,4,5,6] 现在,为了实现使用async等待的功能,我知道我需要用关键字async包装异步函数中的函数,并等待promise.all 但我似乎总是记录下我的promise{

  • 在实际应用中,我对 C# 中的异步和 await 方法进行了说明。请考虑以程,这是工作代码的简单版本: 助手.cs 功能控制器.cs processing.js 现在,问题是第三方服务的所需时间更少(例如:2秒),而所需的时间更多(例如:100秒)。进行两个ajax调用并使用异步和等待是为了呈现自我。屏幕上显示数据1,不要等到自己。Data2已被检索。不幸的是,这种情况没有发生,我必须等待100秒