代码之家  ›  专栏  ›  技术社区  ›  bitshift

尝试理解async并等待[duplicate]

  •  0
  • bitshift  · 技术社区  · 6 年前

    作者代码: https://www.exceptionnotfound.net/using-async-and-await-in-asp-net-what-do-these-keywords-mean/

    那么,根据我现在的理解,以下是真的吗:
    异步方法的好处是,当执行涉及Get*方法的调用时,它们不必等待,因此可以执行下面的代码,当Get*方法最终返回它们的值时,IndexAsync最终可以返回。总结一下?

    public class ContentManagement
    {
        public string GetContent()
        {
            Thread.Sleep(2000);
            return "content";
        }
    
        public int GetCount()
        {
            Thread.Sleep(5000);
            return 4;
        }
    
        public string GetName()
        {
            Thread.Sleep(3000);
            return "Matthew";
        }
        public async Task<string> GetContentAsync()
        {
            await Task.Delay(2000);
            return "content";
        }
    
        public async Task<int> GetCountAsync()
        {
            await Task.Delay(5000);
            return 4;
        }
    
        public async Task<string> GetNameAsync()
        {
            await Task.Delay(3000);
            return "Matthew";
        }
    }
    
    
    
    public class HomeController : Controller
    {
        [HttpGet]
        public ActionResult Index()
        {
            Stopwatch watch = new Stopwatch();
            watch.Start();
            ContentManagement service = new ContentManagement();
            var content = service.GetContent();
            var count = service.GetCount();
            var name = service.GetName();
    
            watch.Stop();
            ViewBag.WatchMilliseconds = watch.ElapsedMilliseconds;
            return View();
        }
    
        [HttpGet]
        public async Task<ActionResult> IndexAsync()
        {
            Stopwatch watch = new Stopwatch();
            watch.Start();
            ContentManagement service = new ContentManagement();
            var contentTask = service.GetContentAsync();
            var countTask = service.GetCountAsync();
            var nameTask = service.GetNameAsync();
    
            var content = await contentTask;
            var count = await countTask;
            var name = await nameTask;
            watch.Stop();
            ViewBag.WatchMilliseconds = watch.ElapsedMilliseconds;
            return View("Index");
        }
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   sean Sergey Berezovskiy    6 年前

    await 遇到,则暂停进度,并将控制权退回到调用方法。等待的操作既不阻塞也不执行(直到稍后)。

    msdoc 例子。

        2
  •  1
  •   Flydog57    6 年前

    GetContent ,并且正在其上运行的线程将休眠指定的毫秒数。调用依次执行,但线程只是 每次通话。

    你的 IndexAsync async . 它在幕后的作用是建立一个执行异步代码的小状态机。

    当你打电话的时候 service.GetContentAsync(); ,调用GetContentAsync,但所发生的只是函数开始执行,然后,当它到达 await Task.Delay(3000); ,它返回一个承诺(到

    稍后,你 await

    任务完成后,其余的代码将再次开始运行。在UI应用程序(如WinForms或WPF)中,可以保证如果在UI线程上启动,其余代码将在同一线程上运行。在其他环境中,担保可能较少涉及。

    awaited 方法调用(或 awaiting 任务)有点像这样。它使用参数调用函数,但将当前函数的其余部分封装在一个窗体中,该窗体将在任务完成时执行。

    在UI应用程序中使用async/await的好处是显而易见的—它允许顺序编程,同时仍然可以从UI线程中获取处理。