首页 > 其他分享 >关于Async、Await的一些知识点

关于Async、Await的一些知识点

时间:2023-10-04 21:55:10浏览次数:28  
标签:知识点 Await SynchronizationContext 执行 线程 Async NET 上下文 await

在ASP.NET Core中,当一个HTTP请求到达服务器时,它会被分配给线程池中的一个线程来处理。该线程会执行相应的Controller方法。

如果这个方法是一个异步方法并且使用了await关键字,那么在await的代码执行完毕之前,这个线程会被释放回线程池,可以用来处理其他的HTTP请求。

当await的代码执行完毕后,ASP.NET Core会从线程池中再次获取一个线程来继续执行剩余的代码。

在await操作符之后的代码块是作为一个回调函数注册到了任务中。当await的任务完成时,这个回调函数会被执行。这个回调函数可能会在原来的线程上执行,也可能在一个新的线程上执行,

这主要取决于所使用的SynchronizationContext(同步上下文)。

在ASP.NET Core中,默认情况下,每个请求都有自己的SynchronizationContext。当await操作在这种情况下被调用时,它会捕获当前的SynchronizationContext,并在任务完成后在这个SynchronizationContext上执行回调。

由于每个请求都有自己的SynchronizationContext,所以即使回调在一个新的线程上执行,它仍然可以访问到请求开始时的所有上下文信息,如HttpContext。

SynchronizationContext和线程上下文是两个不同的概念,它们在.NET中扮演着不同的角色。

线程上下文通常指的是与特定线程相关的一组数据或状态信息。这包括线程的局部存储(Thread Local Storage, TLS)以及其他一些线程特有的状态。例如,在.NET中,每个线程都有自己的执行上下文(ExecutionContext),它包含了线程的安全上下文、逻辑调用上下文和线程本地存储等信息。

SynchronizationContext则是.NET中的一个抽象类,它定义了一种机制,用于在多线程环境中控制和协调代码的执行。SynchronizationContext的主要职责是决定在何处(即在哪个线程上)执行特定的代码块。例如,Windows Forms和WPF框架都提供了自己的SynchronizationContext实现,用于确保只有UI线程可以访问UI元素。

当在.NET中使用async/await模式时,await操作符会捕获当前的SynchronizationContext,并在异步操作完成后在该SynchronizationContext上执行剩余的代码。这是.NET异步编程模型的一个关键部分,它使得异步代码可以正确地在原始上下文(可能是UI线程,也可能是ASP.NET请求线程)上继续执行,尽管在等待异步操作完成的过程中,原始线程可能已经被释放并用于执行其他任务。

标签:知识点,Await,SynchronizationContext,执行,线程,Async,NET,上下文,await
From: https://www.cnblogs.com/tianqing/p/17742818.html

相关文章

  • [Compose] Asynchronous Reactive Data with Promises
    Let’smakeusingtheobserversasynchronous!Thiswaywecanupdatethedataandhavemultipleobserversrunasynchronously.classAsyncData{constructor(initialData){this.data=initialData;this.subscribers=[];}//Subscribetochan......
  • hive知识点散记
    在不切换数据库的前提下查询某一数据库下的所有表showtablesin数据库名;查询显示某一张表的元数据信息descformatted表名;查询当前数据库名称selectcurrent_databases();对查询结果进行去重selectdistinctcnamefromstu;【不写dist......
  • Fastapi 框架知识点总结
    【一】引入为什么Fastapi火【二】Starlette,Pydantic与FastAPI框架是什么关系?Starlette介绍Pydantic介绍三者之间的联系【三】Pydantic使用方法介绍类模型的定义及使用递归模型ORM操作【四】Fastapi环境搭建及初步使用Fastapi环境搭建注意不同版本的包......
  • FastAPI学习-26 并发 async / await
    前言有关路径操作函数的asyncdef语法以及异步代码、并发和并行的一些背景知识async和await关键字如果你正在使用第三方库,它们会告诉你使用await关键字来调用它们,就像这样:results=awaitsome_library()然后,通过asyncdef声明你的路径操作函数:@app.get('/')asy......
  • 【十分钟一个知识点】数据管理、数据安全和大数据
    数据管理数据管理是利用计算机硬件和软件技术对数据进行有效的收集、存储、处理和应用的过程计算机数据的管理已经经历了人工管理、文件管理、数据库管理三个阶段在计算机中,数据一般以文件的形式存储根据编码规则不同,文件格式不同在Windows系统中,用文件拓展名来表示某些特......
  • 【十分钟一个知识点】数据、信息、编码
    数据数据是对客观事物的符号表示信息没有统一的定义,但是我们日常生活中所认为的信息都只是信息的载体特征:载体依附性:信息无法独立存在,依附于载体时效性:信息反映事物某一时间的状态、内容共享性:信息可以共享,同一种信息可以同时被不同的接收者获取可加工处理性、真伪性:信息......
  • Flutter/Dart第04天:Dart异步编程(Future和async/await)
    Dart官网代码实验室:https://dart.dev/codelabs/async-await重要说明:本博客基于Dart官网代码实验室,但并不是简单的对官网文章进行翻译,我会根据个人研发经验,在覆盖官网文章核心内容情况下,加入自己的一些扩展问题和问题演示和总结,包括名称解释、使用场景说明、代码样例覆盖、最后完......
  • 8store async
    认真学习前端打卡第8天9.271.定义storeimport{defineStore}from'pinia'exportconstuseNameStore=defineStore('alerts',{})//optionstore可以包含state,actions,getters;setupstore可以包含ref,computed,function;alert应用中store的唯一id2.npm(node包管理器)3.proxy代理4......
  • 奥数知识点 — 追及问题
    每日一课: 追及问题的要点及解题技巧1、多人相遇追及问题的概念及公式多人相遇追及问题,即在同一直线上,3个或3个以上的对象之间的相遇追及问题。所有行程问题都是围绕""这一条基本关系式展开的,比如我们遇到的两大典型行程题相遇问题和追及问题的本质也是这三个量之......
  • Python sanic AsyncIOScheduler 的单例模式
    sanic是个异步框架。可以配置多个worker,执行定时任务时,也会执行多遍。期望通过单例模式,确保只运行一次。解决思路。AsyncIOScheduler函数有没有自带的单例模式,答案无。网上有没有相关做法,搜集半天,没有太好的办法。试过全局变量,协程共享变量等,均无效。试着用进程的共享变量来解......