Asynchronous 异步/等待:如果它没有';t使用线程它在同时运行处理时做了什么?
我正在做一些研究,以便更好地理解C#的异步/等待 我发现了一个网站,它有以下代码来显示同步处理比异步/等待慢多少:Asynchronous 异步/等待:如果它没有';t使用线程它在同时运行处理时做了什么?,asynchronous,async-await,Asynchronous,Async Await,我正在做一些研究,以便更好地理解C#的异步/等待 我发现了一个网站,它有以下代码来显示同步处理比异步/等待慢多少: public IActionResult Index() { Stopwatch watch = new Stopwatch(); watch.Start(); ContentManagement service = new ContentManagement();
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
将阻止线程-我相信它会一直执行OSSleep
调用,这会导致OS将线程置于等待状态,直到其睡眠时间过期
Task.Delay
更像一个I/O操作。因此,它设置了一个计时器,在时间到期时触发事件。计时器由操作系统本身管理-随着时间的推移(CPU上的时钟滴答声),操作系统将在计时器完成时通知计时器。它比这要复杂一点(为了效率,.NET将合并托管计时器),但这是一般的想法
因此,关键是每个
任务都没有专用线程。延迟被阻止。可能重复感谢您的响应。由于wait Task.Delay并没有完全运行,这个演示是perf的真实例子吗