C# MVC中的return ViewAsync是一种优势吗?为什么';它不存在吗?
我希望这仍然是一个话题。在这篇文章中,我看到了如何创建一个C# MVC中的return ViewAsync是一种优势吗?为什么';它不存在吗?,c#,asp.net-mvc,asp.net-core,async-await,C#,Asp.net Mvc,Asp.net Core,Async Await,我希望这仍然是一个话题。在这篇文章中,我看到了如何创建一个wait viewsync(): 所以我的考虑是:好的,我想让我的应用程序使用多线程,让我们制作一个BaseController,它包含viewsync的那些方法: 只是其中的一部分: public class BaseController : Controller { [NonAction] public virtual async Task<ViewResult> ViewAsync() {
wait viewsync()
:
所以我的考虑是:好的,我想让我的应用程序使用多线程,让我们制作一个BaseController
,它包含viewsync
的那些方法:
只是其中的一部分:
public class BaseController : Controller
{
[NonAction]
public virtual async Task<ViewResult> ViewAsync()
{
return await Task.Run(() => this.View(null));
}
[NonAction]
public virtual async Task<ViewResult> ViewAsync(string viewName)
{
return await Task.Run(() => this.View(viewName, this.ViewData.Model));
}
// the other implementations....
}
公共类BaseController:控制器
{
[不行动]
公共虚拟异步任务ViewAsync()
{
返回wait Task.Run(()=>this.View(null));
}
[不行动]
公共虚拟异步任务ViewAsync(字符串viewName)
{
返回wait Task.Run(()=>this.View(viewName,this.ViewData.Model));
}
//其他实现。。。。
}
现在我可以在继承类中始终这样调用:
[HttpGet]
public async Task<IActionResult> DoSomething()
{
// maybe we need to do something here, maybe not
return await ViewAsync(new DoSomethingObject());
}
[HttpGet]
公共异步任务DoSomething()
{
//也许我们需要在这里做点什么,也许不是
return wait viewsync(new DoSomethingObject());
}
我的优点/目标是性能,因为我现在总是可以使用多线程
我的考虑对吗?
在帖子中,对答案的评论以
开头,我不会这么做。但投票/评论/答案并不多。。这种实施的风险或缺点在哪里?也许,为什么Microsoft.AspNetCore.Mvc.Controller不提供方法viewsync
?任何web应用程序都已经使用了多线程。当请求传入时,线程池中的线程将处理该请求。您的应用程序已同时处理多个请求,而您没有使用任务。请运行
Async/await很有用,这样在等待异步操作完成(如查询数据库)时,就不会从线程池中阻塞线程。
启动新任务Task.Run
在默认线程池上运行几乎毫无用处,除非你正在做一些CPU密集型工作。假设您有一个端点,在每个请求上计算最多n个素数,在这种情况下,您可以在返回素数的默认线程池上委托一个新任务,并有一个视图将它们呈现给某个html
渲染视图没有任何异步性,因此不需要ViewAsync。为视图准备数据可能是异步的,但渲染不是。另外,使用viewsync
可能会使模板语法过于复杂。任何web应用程序都已经使用多线程。当请求传入时,线程池中的线程将处理该请求。您的应用程序已同时处理多个请求,而您没有使用任务。请运行
Async/await很有用,这样在等待异步操作完成(如查询数据库)时,就不会从线程池中阻塞线程。
启动新任务Task.Run
在默认线程池上运行几乎毫无用处,除非你正在做一些CPU密集型工作。假设您有一个端点,在每个请求上计算最多n个素数,在这种情况下,您可以在返回素数的默认线程池上委托一个新任务,并有一个视图将它们呈现给某个html
渲染视图没有任何异步性,因此不需要ViewAsync。为视图准备数据可能是异步的,但渲染不是。另外,使用viewsync
可能会使模板语法过于复杂。aView
只是一个连接字符串的类。没有理由让它们异步
,因为它们应该是轻量级的,易于处理的。您的示例仅为此创建线程池线程,这太多了。View
只是一个连接字符串的类。没有理由让它们异步
,因为它们应该是轻量级的,易于处理的。您的示例仅为此创建线程池线程,这太多了。总之,只有当我的视图执行需要大量CPU的特殊操作时,这才有意义?@MatthiasBurger嗯,视图应该只将数据呈现为html。。。当需要渲染的数据需要大量CPU时,启动新任务是有意义的。实际的渲染部分不应该占用那么多CPU。您几乎不应该在web应用程序上下文中使用Task.Run
。一个web服务器有一个“max requests”,这实际上就是它在一个进程中可以产生多少线程。使用Task.Run
从池中获取额外的线程,实际上降低了服务器的总体吞吐量<代码>任务.运行
实际上是为了在本机应用程序(桌面,移动设备)中将内容从默认线程中移出,在本机应用程序中,您有一个永远不会被阻止的主UI线程。因此,总之,只有当我的视图执行需要大量CPU的特殊操作时,这才有意义?@MatthiasBurger嗯,视图应该只将数据呈现为html。。。当需要渲染的数据需要大量CPU时,启动新任务是有意义的。实际的渲染部分不应该占用那么多CPU。您几乎不应该在web应用程序上下文中使用Task.Run
。一个web服务器有一个“max requests”,这实际上就是它在一个进程中可以产生多少线程。使用Task.Run
从池中获取额外的线程,实际上降低了服务器的总体吞吐量Task.Run
实际上是用于将内容从本机应用程序(桌面、移动)的默认线程中移出,在本机应用程序中,您有一个永远不应该被阻止的主UI线程。