async / await:如果不使用线程,那么对于同时运行处理该怎么做?

Ric*_*ard 2 asynchronous async-await

我正在做一些研究,以更好地理解C#的异步/等待。

我发现一个网站,其中包含以下代码,以显示同步处理与异步/等待相比要慢多少:

 public IActionResult 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");
        }


        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";
            }
        }
Run Code Online (Sandbox Code Playgroud)

我从较高的角度理解了上面的代码,以及为什么执行得更快。

我不明白的是,如果不使用线程,进程如何同时运行?

我在几个地方读过async / await不会创建新线程来进行处理。那么,异步/等待做什么以允许处理同时发生?三个等待的Task.Delay正在并行运行,对吗?如果未创建3个线程,它在做什么?

我只想了解高水平的情况。

让我知道。

提前致谢。

das*_*ght 5

如果未使用线程,该处理如何同时运行?

线程使您可以并行化同一系统上的计算。当涉及通信或其他I / O时,您的代码将与另一个系统进行通信。启动任务时,另一个系统开始工作。这与您的系统并行发生,在您await执行任务之前,它可以自由执行其需要做的其他任何事情。

这三个await Task.Delay是并行运行的,对吗?

它们运行不完全,正在并行睡眠。睡觉需要很少的资源。这就是为什么它们似乎并行运行。