Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core MVC中是否应该始终使用异步控件进行数据访问_Asp.net Core_.net Core_Entity Framework Core_Asp.net Core Mvc_Npgsql - Fatal编程技术网

Asp.net core MVC中是否应该始终使用异步控件进行数据访问

Asp.net core MVC中是否应该始终使用异步控件进行数据访问,asp.net-core,.net-core,entity-framework-core,asp.net-core-mvc,npgsql,Asp.net Core,.net Core,Entity Framework Core,Asp.net Core Mvc,Npgsql,ERP+购物车ASP.NET MVC 4.8应用程序计划迁移到.NET 5 MVC核心应用程序。 计划使用具有NpgSql数据提供程序的实体框架核心 MVC4.8应用程序不使用任何异步方法 .NET 5中有用于数据访问的异步方法,如ToListSync()、ExecuteSqlInterpolatedAsync() 核心MVC控制器的示例返回异步任务,如 [HttpPost] public async Task<IActionResult> LogOn(LogOnMo

ERP+购物车ASP.NET MVC 4.8应用程序计划迁移到.NET 5 MVC核心应用程序。 计划使用具有NpgSql数据提供程序的实体框架核心

MVC4.8应用程序不使用任何异步方法

.NET 5中有用于数据访问的异步方法,如ToListSync()、ExecuteSqlInterpolatedAsync()

核心MVC控制器的示例返回异步任务,如

    [HttpPost]
    public async Task<IActionResult> LogOn(LogOnModel model, string returnUrl,
        [FromServices] ShoppingCart shoppingcart
        )
[HttpPost]
公共异步任务登录(LogOnModel模型、字符串返回URL、,
[FromServices]购物车购物车
)
将有100个人用户。 应用程序还具有通过http提供json数据的Web API。购物车部分允许搜索引擎扫描的任何访问

Ngpsql支持连接池,因此会自动添加多个连接。 应用程序托管在DebianLinuxVPS服务器上,使用Apache有4个核心

VSP有20GB的RAM,所以Linux缓存了大量数据。然而,大部分时间可能仍然被从Postgres数据库读取数据所消耗。 大多数控制器在数据库中读写数据

回答

建议始终使用异步方法进行数据访问

回答

建议不要总是使用异步

各国的结论

然而,异步操作并不是零成本的,而是编写异步代码 需要更多的关注和熟练,而且它也有自己的挑战

同一VPS服务器中的应用程序和数据库

回答

声明若应用程序和数据库位于同一服务器中,则不应使用async

回答

我想说,无论您在哪里进行I/O,都可以使用它

但后来:

如果你说的是ASP.NET MVC,它只有一个数据库后端, 那么,您(几乎可以肯定)将无法获得任何可伸缩性 从异步中获益。这是因为IIS可以处理更多的并发数据 SQL server(或其他经典RDBMS)的单个实例以外的请求

在我的情况下,有两种升级路径:

  • 继续仅使用同步方法。不要在异步上浪费资源。可以使用已测试的现有MVC控制器代码。红隼中的线程数量不受限制。假设将来.NET编译器通过分析应用程序创建异步代码,手动异步将过时

  • 将MVC控制器签名更改为

    公共异步任务

    将所有EF数据访问调用替换为异步调用。假设这是保留的坚实的.NET功能。重新计算代码的系数,以便更改后不会出现Visual Studio 2019警告。在我的应用程序发布后,这允许优化现有代码,而无需重新编写

  • 在这种情况下应该使用哪种升级路径?
    将所有内容更改为异步会在代码中引入新的错误吗?

    异步对于web应用程序不是强制性的。它主要只对GUI是强制性的

    您的应用程序将继续工作。异步编程非常擅长处理大量请求。但你说你最多有100个用户。如果他们是100.000,你的申请将遭受很大的损失

    我可以肯定地说,
    async
    编程确实带来了挑战,因为例如,如果处理不当,事务就会出现问题

    当然,线程也有成本。异步的存在是为了避免每个线程所需的500KB开销。这意味着运行应用程序的机器可能需要垂直缩放。从这个意义上讲,异步可以节省RAM

    选择权在你。既然你正在重构你的应用程序,你可以努力把它改进到下一步,为更大规模的应用做好准备

    否则,对于100个用户,您的应用程序仍然可以正常工作

    [编辑]一句话抵得上1000个字。在异步上下文中,应使用
    TransactionScopeAsyncFlowOption.Enabled
    初始化事务,以避免描述的异常,并告知事务引擎线程正在参与异步流。为了简单起见,异步流共享同一个线程,因此应用程序代码(事务管理是C#code)不能依赖于线程本地信息,每次上下文切换到另一个异步流请求注意时,都必须清理上下文


    结论:你的第一个评论是正确的。异步流大大减少了并发请求上的RAM利用率。

    谢谢。在VPS中,RAM受到限制并禁用交换以延长SSD磁盘寿命。因此,在我的例子中,当存在并发请求时,异步似乎可以节省RAM?在哪里可以阅读有关异步事务问题的信息?应该在事务中避免异步数据访问方法调用吗?我修改了我的答案,异步数据访问方法可以避免,也可以管理。