Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.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# 在ASP.NET MVC控制器中始终使用异步_C#_Asp.net Mvc_Asynchronous - Fatal编程技术网

C# 在ASP.NET MVC控制器中始终使用异步

C# 在ASP.NET MVC控制器中始终使用异步,c#,asp.net-mvc,asynchronous,C#,Asp.net Mvc,Asynchronous,我最近继承了一个ASP.NET MVC项目。在该项目中,开发人员到处使用async。我在试着评估这是否是个好主意。具体来说,我现在正在检查控制器代码 在控制器中,开发人员编写了如下内容: public async Task<ActionResult> Index() { return View(); } 如果控制器代码中使用了await,我可以理解使用async。很多时候,它并没有被使用。这种方法有什么理由吗?没有。在任何地方使用异步都不是一个好主意 关于缺少的wait,当As

我最近继承了一个ASP.NET MVC项目。在该项目中,开发人员到处使用
async
。我在试着评估这是否是个好主意。具体来说,我现在正在检查控制器代码

在控制器中,开发人员编写了如下内容:

public async Task<ActionResult> Index()
{
  return View();
}

如果控制器代码中使用了
await
,我可以理解使用
async
。很多时候,它并没有被使用。这种方法有什么理由吗?

没有。在任何地方使用异步都不是一个好主意

关于缺少的wait,当
Async
方法不包含
wait
运算符时,编译器会发出警告。没有等待的异步方法将同步运行,这使得语义不正确

对于您的特定示例,该操作简单且运行时间短,这就是为什么使用Async/Await不会带来任何好处,也不应该使用它,因此您可以使用:

public ActionResult Index()
{
    return View();
}
异步/等待应用于执行某种IO(例如网络请求、数据库访问等)的控制器方法。如果一个控制器方法正在做CPU限制的工作(例如数学计算),那么使用Async/Await实际上会使性能变差,除非您的测量结果证明我错了


旧规则适用:测量两次,切割一次

如果此方法中没有
等待
,则没有必要采取行动/方法。Making method
async
意味着“机箱下”(由编译器创建)将被创建为状态机,与纯void版本相比,这会产生一点开销(开销非常小,但如果每秒有数以百万计的请求,则会产生不同;)。如果您害怕可能很快就会引入wait(您最好有充分的理由“感到害怕”),并且有很多代码依赖于此方法(例如,它是抽象类方法/它属于接口),那么您应该保持方法返回
任务
,但不将其标记为异步。例如:

public Task<ActionResult> MyAction() {

    return Task.FromResult<ActionResult>(View());
}
公共任务MyAction(){
返回Task.FromResult(View());
}
Task.FromResult
方法返回已完成的任务-这将阻止编译器创建异步状态机

回到你的主要问题——似乎写这段代码的人不知道他们在做什么——标记方法async并不意味着方法“异步”工作。

I这总结了异步控制器的用途。
public Task<ActionResult> MyAction() {

    return Task.FromResult<ActionResult>(View());
}