Asynchronous 异步/等待:如果它没有';t使用线程它在同时运行处理时做了什么?

Asynchronous 异步/等待:如果它没有';t使用线程它在同时运行处理时做了什么?,asynchronous,async-await,Asynchronous,Async Await,我正在做一些研究,以便更好地理解C#的异步/等待 我发现了一个网站,它有以下代码来显示同步处理比异步/等待慢多少: public IActionResult Index() { Stopwatch watch = new Stopwatch(); watch.Start(); ContentManagement service = new ContentManagement();

我正在做一些研究,以便更好地理解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";
            }
        }
public IActionResult Index()
{
秒表=新秒表();
watch.Start();
ContentManagement服务=新建ContentManagement();
var content=service.GetContent();
var count=service.GetCount();
var name=service.GetName();
看,停;
ViewBag.watchMillistics=watch.elapsedmillistics;
返回视图();
}
[HttpGet]
公共异步任务IndexAsync()
{
秒表=新秒表();
watch.Start();
ContentManagement服务=新建ContentManagement();
var contentTask=service.GetContentAsync();
var countTask=service.GetCountAsync();
var nameTask=service.GetNameAsync();
var content=等待contentTask;
var count=等待countTask;
var name=等待nameTask;
看,停;
ViewBag.watchMillistics=watch.elapsedmillistics;
返回视图(“索引”);
}
公共类内容管理
{
公共字符串GetContent()
{
《睡眠》(2000年);
返回“内容”;
}
public int GetCount()
{
睡眠(5000);
返回4;
}
公共字符串GetName()
{
睡眠(3000);
返回“马太”;
}
公共异步任务GetContentAsync()
{
等待任务。延迟(2000);
返回“内容”;
}
公共异步任务GetCountAsync()
{
等待任务。延迟(5000);
返回4;
}
公共异步任务GetNameAsync()
{
等待任务。延迟(3000);
返回“马太”;
}
}
我从较高的层次上理解了上述代码,以及为什么它执行得更快

我不明白的是,如果没有使用线程,那么处理如何同时运行

我在几个地方读到async/await不会创建新线程来进行处理。那么,async/await做了什么来允许同时进行处理呢?三个等待任务。延迟并行运行,对吗?如果它没有创建3个线程,它在做什么

我只是想了解在高层发生了什么

让我知道

提前谢谢

如果没有使用线程,那么处理如何同时运行

线程允许您在同一系统上并行计算。当涉及通信或其他I/O时,代码与另一个系统通信。当您启动任务时,另一个系统开始工作。这与您的系统并行,系统可以自由地执行它需要执行的任何其他操作,直到您等待任务

三个
等待任务。Delay
并行运行,对吗

他们不是在跑步,而是在平行睡觉。睡觉只需要很少的资源。这就是为什么它们看起来是并行的

我不明白的是,如果没有使用线程,那么处理如何同时运行

您可以将其视为在操作完成时触发事件,而不是在操作完成之前阻塞线程

我在几个地方读到async/await不会创建新线程来进行处理

异步
等待
不;这是真的。有关
async
wait
如何工作的更多信息

那么,async/await做了什么来允许同时进行处理呢

async
/
await
的主要用例之一是基于I/O的代码。我有一篇很长的博客文章,详细介绍了我的工作

三个等待任务。延迟并行运行,对吗

我更喜欢使用术语“并发”,只是为了避免与
Parallel
和Parallel LINQ混淆,这两个术语都是为CPU限制的并行而创建的,在
async
/
wait
中不能像通常预期的那样工作。所以,我想说并行和异步都是并发的形式,这是异步并发的一个例子

(也就是说,使用“平行”一词肯定与该词的常用用法一致)

如果它没有创建3个线程,它在做什么

Task.Delay
不是一种基于I/O的操作,但与之非常相似。它在下面使用计时器,所以它完全不同于
Thread.Sleep

Thread.Sleep
将阻止线程-我相信它会一直执行OS
Sleep
调用,这会导致OS将线程置于等待状态,直到其睡眠时间过期

Task.Delay
更像一个I/O操作。因此,它设置了一个计时器,在时间到期时触发事件。计时器由操作系统本身管理-随着时间的推移(CPU上的时钟滴答声),操作系统将在计时器完成时通知计时器。它比这要复杂一点(为了效率,.NET将合并托管计时器),但这是一般的想法


因此,关键是每个
任务都没有专用线程。延迟被阻止。

可能重复感谢您的响应。由于wait Task.Delay并没有完全运行,这个演示是perf的真实例子吗