【问题标题】:How async works in ASP.NET web applications?异步在 ASP.NET Web 应用程序中是如何工作的?
【发布时间】: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,那么我们的主线程将被释放并返回给线程池,一旦所有任务完成,我们就会得到 我们的话题回到继续。

首先,如果我在哪里错了,请澄清我的概念?

那么我有几个困惑:

  1. 如果我们的线程被分配给线程池,那么哪个线程将工作 在WhenAll中的任务上。
  2. 我们是否返回了相同的线程 在WhenAll 完成后还是随机给我们一个新线程?

【问题讨论】:

  • 你为什么关心'哪个'线程?如果线程被重新使用,它是否算作“相同”线程?我认为这样做的要点之一是将这些细节抽象出来,这样你就不必关心......
  • 您似乎以某种方式将 ASP SynchronizationContext 实现等同于 WPF 或 Winforms 实现。不太一样。
  • "但是,IIS 没有自己的线程池,它使用 CLR 的线程池。"这是完全错误的。您将不得不阅读一些严肃的 ASP.NET 书籍和文章,而不是猜测。

标签: c# asp.net asynchronous async-await task-parallel-library


【解决方案1】:

他们通过使用时间片来使用 CPU。

这就是你错的地方。 线程 通过时间片共享一个 CPU。任务完全不同。

有两种任务:委托任务和承诺任务。委托任务将在一个线程上执行——它们实际上有代码要运行,因此它们必须占用 CPU。但是,委托任务在异步代码中极为罕见,一般不应该在 ASP.NET 上使用。

Promise 任务是绝大多数异步代码使用的。承诺任务只是代表某种“完成”。对于他们的绝大多数工作,他们执行代码,并且不需要 CPU。有关如何实现这一点的更多信息,请参阅我的博文There Is No Thread

如果我们的线程被分配给线程池,那么哪个线程将处理WhenAll 中的任务。

不需要线程。这就是在 ASP.NET 上使用异步代码的全部意义所在。

是在WhenAll 完成后返回相同的线程还是随机给我们一个新线程?

它是线程池中的一个线程,可能与您开始时使用的线程相同,也可能不同。为此,使用[ThreadStatic]之类的会出现问题。

有关异步工作原理的更多信息,我建议阅读我的 async intro 和我在 async ASP.NET 上的文章。有关这两种任务的更多信息,我建议阅读我的 Task overviewTask status 博客文章。

【讨论】:

  • “可能与您开始使用的相同,也可能不同”:是的,我已经很难学到这一点:我们已经向 Web 应用程序添加了异步处理,并且我了解到之后await 处理可以在新线程中继续。不幸的是,WebOperationContext.Current 在另一个线程中无效——或者至少在 .NET 版本 4.6.2 中修复之前就是这种情况!
  • 我将阅读您的博客和书籍,以深入了解 .NET 中的并发性。你是冠军..非常感谢:)
  • @Stephen - 你能回答这个吗 - stackoverflow.com/questions/47239986/…
猜你喜欢
  • 2016-01-30
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多