【发布时间】:2017-05-18 19:08:15
【问题描述】:
我的理解:
异步不同于线程。在 Async 中,我们使用单个线程并且可以从中运行多个任务。在.Net framework 中,我们有一个线程池,它为每个新的http web 请求分配一个新线程。所以每个请求都由一个线程处理。但是,IIS 没有自己的线程池,它使用 CLR 的线程池。
如果我们在网络请求中创建任何新的附加线程,那么我们会从线程池中丢失一个线程,如果您的网站有大量流量,那么您的网站用户就有 等到任何线程空闲。所以最好在 ASP.Net 应用程序中使用异步任务。异步任务将在我们的单线程中执行 主网络请求正在执行。
异步的工作原理。假设我们在一个控制器中创建了两个独立/异步任务,假设它们是 T1 和 T2。 T1 执行一段时间间隔,然后执行 T2。然后再次主网络请求。他们通过使用时间片来使用 CPU。
Web Request -----> Single Thread Pool Thread (Main Request + T1 +T2)
=>
Execution Lifecycle --> [Main request, T1, T2, T1, Main Request, T2, T1.....]
如果我们使用await Task.WhenAll,那么我们的主线程将被释放并返回给线程池,一旦所有任务完成,我们就会得到
我们的话题回到继续。
首先,如果我在哪里错了,请澄清我的概念?
那么我有几个困惑:
- 如果我们的线程被分配给线程池,那么哪个线程将工作 在WhenAll中的任务上。
- 我们是否返回了相同的线程 在WhenAll 完成后还是随机给我们一个新线程?
【问题讨论】:
-
你为什么关心'哪个'线程?如果线程被重新使用,它是否算作“相同”线程?我认为这样做的要点之一是将这些细节抽象出来,这样你就不必关心......
-
您似乎以某种方式将 ASP
SynchronizationContext实现等同于 WPF 或 Winforms 实现。不太一样。 -
"但是,IIS 没有自己的线程池,它使用 CLR 的线程池。"这是完全错误的。您将不得不阅读一些严肃的 ASP.NET 书籍和文章,而不是猜测。
标签: c# asp.net asynchronous async-await task-parallel-library