异步如何在ASP.NET Web应用程序中工作?

Ank*_*ain 2 c# asp.net asynchronous task-parallel-library async-await

我的下载:

异步与线程不同.在Async中,我们使用单个线程并可以从中运行多个任务.在.Net framework,我们有一个线程池,它在每个新的http Web请求上分配一个新线程.所以每个请求都由一个线程处理.但是,IIS没有它自己的线程池,它使用CLR的线程池.

如果我们在Web请求中创建任何新的附加线程,那么我们将从线程池中丢失一个线程,如果您的站点有大量流量,那么您的站点用户必须等到任何线程获得空闲.因此,最好在ASP.Net应用程序中使用异步任务.异步任务将在我们的主Web请求正在执行的单个线程中执行.

异步如何工作.假设我们在控制器中创建两个独立/异步任务,假设它们是T1和T2.T1执行一段时间间隔然后执行T2.然后再次主要Web请求.他们通过使用时间切片来使用CPU.

    Web Request -----> Single Thread Pool Thread (Main Request + T1 +T2) 
    =>
    Execution Lifecycle --> [Main request, T1, T2, T1, Main Request, T2, T1.....]
Run Code Online (Sandbox Code Playgroud)

如果我们使用await Task.WhenAll那么我们的主线程被释放并返回给线程池,一旦所有任务完成,我们将给予我们的线程以继续.

首先,如果我错在哪里,清除我的概念?

然后我几乎没有什么困惑:

  1. 如果我们的线程被赋予线程池,那么哪个线程将在WhenAll中的任务上工作.
  2. 在WhenAll完成后,我们是否给出了相同的线程,或者我们随机给出一个新线程?

Ste*_*ary 9

他们通过使用时间切片来使用CPU.

这是你错了.线程通过时间分片共享CPU.任务完全不同.

有两种任务:委派任务和承诺任务.委托任务将在一个线程上执行 - 它们实际上有代码可以运行,因此它们必须耗尽CPU.但是,委派任务在异步代码中极为罕见,通常不应在ASP.NET上使用.

Promise Tasks是绝大多数异步代码使用的.承诺任务只是代表某种"完成".对于他们绝大多数的工作,他们执行代码,也不需要CPU.有关如何实现这一点的更多信息,请参阅我的博客文章"没有线程".

如果我们的线程被赋予线程池,那么哪个线程将在WhenAll中的任务上工作.

没有线程是必要的.这就是在ASP.NET上使用异步代码的重点.

在WhenAll完成后,我们是否给出了相同的线程,或者我们随机给出一个新线程?

它是来自线程池的线程,它可能与您开始的线程相同,也可能不同.因此,使用[ThreadStatic]等会引起问题.

有关异步如何工作的更多信息,我建议您阅读我的async介绍以及异步ASP.NET上的文章.有关这两种类型任务的更多信息,我建议您阅读我的任务概述任务状态博客文章.