具有异步/等待的可扩展操作

Vido灯

我对编程非常陌生,并且正在从事我的第一个自我项目,这是一个我使用ASP.NET MVC 5创建的论坛,我正在尝试从中学习。我在这里和MSDN中读到很多有关MVC中异步动作的内容,我有几个我无法弄清的问题。

  1. 据我了解,IIS为每个进程分配了x个线程,例如2个。每个线程可以处理一个请求。当我将一个动作标记为异步并用任务包装返回类型时,线程将分配一个工作器来处理该请求,并向IIS报告它现在可以自由地处理另一个请求。因此,如果一个线程可以创建3个工作线程,那么我的操作可以处理6个请求。正确的?
    据我了解,异步方法必须等待另一个异步方法才能真正异步,否则,该方法将同步运行。所以我的问题是,线程何时确切分配此工作程序?什么时候请求或何时调用等待的方法?

  2. 再次,据我了解,每个异步方法都分配给一个工作程序,因此,如果我的网站上有6个工作人员备用(根据上述问题),随着我使用越来越多的异步方法,可以处理请求的工作程序数量会减少吗?举例来说,如果我有一个异步的行动,异步地将呼叫GetUser和内部GetUser调用异步地以GetUserHistory和内部GetUserHistory调用异步地以GetLoginData意志行动“浪费” 4名工人,可能有服务请求?

  3. 如果以上所有条件都是正确的,将动作标记为异步并在我的项目同步方法中使所有方法都处于同步状态,并且在动作结束时(或开始时)只是等待,这是否具有伸缩性?Task.Delay(0)我将“浪费”只有一名工人?

我看到了这些问题,并且我认为有些根本不了解的事情。

埃里克·飞利浦

1.据我了解,IIS为每个进程分配了x个线程...

可以比这更详细。有计算机设置,IIS设置,应用程序池/域设置。

试图了解线程的作用使得非常难以理解正在发生的事情。而是考虑每个请求。每个请求至少使用一个线程。在异步控制器方法中,如果运行时确定存在进行线程上下文切换的有效机会(例如,等待IO操作),则另一个线程可能会继续请求。

因此,当请求A进入时,线程A开始执行请求。如果线程A调用IO异步操作(例如ExecuteReaderAync),则存在一种计算机状态,该状态可跟踪发生异步操作时该线程在做什么。线程A变得很清楚,可以开始完成另一个请求(B)。当计算机状态(或其任何状态)确定需要一个线程来继续请求(A)时,线程A或其他一些线程将获取计算机状态并继续请求。

我使用越来越多的异步方法时,可以处理请求的工作人员数量会减少吗?

在正常情况下,不,您实际上释放了通常等待IO操作完成以处理其他请求的线程。向方法添加异步不会更改该方法的线程模型,它仅向运行时表示它可能会遇到“暂停”当前操作的机会。

3.如果以上所有条件都成立...

没关系,所以断言无关紧要。

为什么异步方法将调用其他线程来处理请求?

一个async方法不会更改线程的工作方式,而只能使用await

我的意思是,只有异步方法才会触发新线程

不,这也是错误的。既不在代码中async也不await 启动新线程。

例子:

public async ActionResult MyMethod()
{
  await DoIt();

  return View();
}

public async void Doit()
{
  await DoMore();
}

public async void DoMore()
{
  await Task.Delay(1000);
}

此代码将始终仅使用一个线程。我们不会产生/使用其他线程(可能来自线程池),而是使用机器状态来释放线程DoMore()以满足其他请求。同一线程可能启动也可能不会启动并完成此请求。

更新

假设您可以将.Net应用程序设置为仅使用单个线程。如果在请求1启动并等待20秒完成请求时没有异步,则请求2将等待线程变为可用(或获得500,IIS线程不足)。

ASP.Net MVC同步

现在,改为配置您的控制器和方法,以进行到的异步调用await SomeSqlAyncMethod(),线程可以自由响应请求2并返回html。SQL调用完成后,线程将被重用以完成请求1。

ASP.Net MVC异步

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有异步/等待的递归setTimeout

来自分类Dev

具有异步/等待的递归setTimeout

来自分类Dev

具有异步/等待的递归setTimeout

来自分类Dev

ngOnInit 中所有异步操作的角度等待栏

来自分类Dev

具有异步和等待的MVC动作

来自分类Dev

具有异步/等待功能的npm mv模块

来自分类Dev

具有异步操作的std :: function回调

来自分类Dev

具有异步lambda的Parallel.ForEach等待所有迭代完成

来自分类Dev

多个工作线程与一个具有异步/等待功能的工作线程

来自分类Dev

承诺所有异步操作

来自分类Dev

具有异步功能的JavaScript数组

来自分类Dev

具有异步请求的NodeJS

来自分类Dev

具有异步结构的openxml

来自分类Dev

具有异步功能的OracleCommand ExecuteNonQuery

来自分类Dev

具有异步功能的装饰器

来自分类Dev

具有异步功能的意外令牌

来自分类Dev

具有异步请求的递归函数

来自分类Dev

具有异步方法的RxJava for循环?

来自分类Dev

如何编写具有异步设置和拆卸操作的测试?

来自分类Dev

如果仍然有异步操作在等待中的basic_waitable_timer被破坏怎么办?

来自分类Dev

NodeJS等待所有异步命令完成

来自分类Dev

如何等待所有异步完成?

来自分类Dev

NodeJS中没有异步功能的等待如何工作?

来自分类Dev

如何使Parallel等待所有异步任务完成?

来自分类Dev

具有异步QFileSystemModel的Qt异步显示

来自分类Dev

具有异步委托的异步函数的命名约定

来自分类Dev

带有异步操作的助焊剂存储依赖项

来自分类Dev

具有异步计算的Scala不变性(Akka)

来自分类Dev

具有异步网络请求的ReactiveCocoa排序