• 关于Async、Await的一些知识点


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

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

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

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

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

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

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

    ASP.NET Core使用了一种不同的模型来处理请求,称为中间件管道模型。在这种模型中,请求在一系列中间件之间传递,每个中间件可以选择传递请求到下一个中间件,或者处理请求并结束管道。

    因此,ASP.NET Core不需要使用SynchronizationContext来在异步操作完成后将执行上下文切换回原始请求上下文。相反,当一个中间件完成其异步操作时,它只需简单地返回到调用它的中间件。如果需要切换到不同的线程,它可以通过Task库来完成。

    这种模型允许ASP.NET Core更好地管理线程,提高了性能和可扩展性。

    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请求线程)上继续执行,尽管在等待异步操作完成的过程中,原始线程可能已经被释放并用于执行其他任务。

  • 相关阅读:
    数据库-第二/三章 关系数据库和标准语言SQL【期末复习|考研复习】
    全球回收标准GRS认证 难不难?
    【将文本编码为图像灰度级别】以 ASCII 编码并与灰度级别位混合将文本字符串隐藏到图像像素的最低位中,使其不明显研究(Matlab代码实现)
    Java学习笔记——Map之HashMap
    解决Golang编译、执行单测、运行程序遇到:cgo: malformed DWARF TagVariable entry 的问题
    敏捷开发中,Sprint回顾会的目的
    基于水循环优化的BP神经网络(分类应用) - 附代码
    计算机毕业设计(附源码)python在线学习交流平台
    vue移动端H5调起手机发送短信(兼容ios和android)
    面试官让你说说react状态管理?
  • 原文地址:https://www.cnblogs.com/tianqing/p/17742818.html