我在这里读了大约async篇文章:http://www.asp.net/web-forms/tutorials/aspnet-45/using-asynchronous-methods-in-aspnet-45篇,作者说:

在进行异步工作时,并不总是使用线程.

所以我想理解的是,如果我们不使用任何线程来并发执行,它怎么会变成async?"你不总是用线"是什么意思?

首先让我解释一下关于使用线程的知识(一个简单的例子,当然线程可以在不同的情况下使用,而不是UI和Worker方法)

  1. 你有UI线程来接受输入,给出输出.
  2. 你可以在UI线程中处理事情,但这会使UI没有响应.
  3. 假设我们有一个与流相关的操作,我们需要下载一些数据.
  4. 我们还允许用户在下载时做其他事情.
  5. 我们创建一个新的工作线程,下载文件并更改进度条.
  6. 一旦完成,就没有什么可以做的了,所以线程被终止.
  7. 我们从UI线程继续.

我们可以根据情况在UI线程中等待工作线程,但在此之前,当文件正在下载时,我们可以使用UI线程做其他事情,然后等待工作线程.

async个节目不一样吗?如果没有,有什么区别?我读到async个编程使用ThreadPool个线程.

推荐答案

异步编程不需要线程.

异步表示接口不挡路calling线程.它确实表示is阻塞了另一个线程.

首先,考虑您的UI示例,这次使用实际异步API:

  1. 你有UI线程来获取输入,给出输出.
  2. 你可以在UI线程中处理事情,但这会使UI没有响应.
  3. 假设我们有一个与流相关的操作,我们需要下载一些数据.
  4. 我们还允许用户在下载时做其他事情.
  5. We use asynchronous APIs to download the file.不需要工作线程.
  6. 异步操作将其进度报告回UI线程(更新进度条),并将其完成情况报告给UI线程(它可以像任何其他事件一样响应).

这显示了如何只涉及一个线程(UI线程),但也有异步操作在进行.您可以启动多个异步操作,但这些操作只涉及一个线程-它们上不会阻塞任何线程.

async/await提供了一个非常好的语法,用于启动一个异步操作,然后返回,并在该操作完成后继续该方法的其余部分.

ASP.NET与之类似,只是它没有主/UI线程.相反,对于每个不完整的请求,它都有一个"请求上下文".ASP.NET线程来自线程池,当它们处理请求时,它们会进入"请求上下文";完成后,它们退出"请求上下文"并返回线程池.

ASP.NET跟踪每个请求的不完整异步操作,因此当线程返回到线程池时,它会判断该请求是否有任何正在进行的异步操作;如果没有,则请求已完成.

因此,当您在ASP中执行一个不完整的异步操作时.NET时,线程将递增该计数器并返回.ASP.NET知道请求没有完成,因为计数器不是零,所以它没有完成响应.线程返回到线程池,此时:有no个线程处理该请求.

异步操作完成后,它会将async方法的其余部分调度到请求上下文.ASP.NET获取它的一个处理程序线程(可能是也可能不是执行async方法早期部分的同一个线程),计数器递减,线程执行async方法.

ASP.NET vNext略有不同;在整个框架中,异步处理程序得到了更多支持.但总体概念是一样的.

有关更多信息:

Asp.net相关问答推荐

如何在asp.net中单击按钮的新选项卡中打开页面?

为 Web 请求实现速率限制算法的最佳方法是什么?

Anti-Forgery Token 适用于不同的基于声明的用户

如何在 ASP.NET Web 窗体中使用依赖注入

iOS 8 / Safari 8 不适用于 ASP.NET AJAX 扩展

学习什么 - Ruby on Rails 或 ASP .NET MVC...鉴于熟悉 ASP .NET

发布发布事件

Ef core:执行 MaxAsync 时序列不包含任何元素

页面在谷歌浏览器中加载两次

如何在 C# 中转换 TryCast?

如何从 SQL Server 2008 本身获取客户端 IP 地址?

如何获取 ASP.NET 应用程序的完整虚拟路径

等价于 ASP.NET Core 中的 Html.RenderAction

如何在 C# 应用程序中调用 VBScript 文件?

如何使用 WebRequest 发布数据并从网页获取响应

System.Reflection.Assembly.LoadFile 锁定文件

如何从 ASP.NET Identity 获取用户列表?

如何解决我的 ASP.Net MVC 应用程序中的 iisreset 后发生的 AntiForgeryToken 异常?

Application_End global.asax

如何使用 int ID 列更改 ASP.net Identity 2.0 的表名?