Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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
C# MVC中的return ViewAsync是一种优势吗?为什么';它不存在吗?_C#_Asp.net Mvc_Asp.net Core_Async Await - Fatal编程技术网

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
可能会使模板语法过于复杂。

a
View
只是一个连接字符串的类。没有理由让它们
异步
,因为它们应该是轻量级的,易于处理的。您的示例仅为此创建线程池线程,这太多了。
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线程。