c# - 我使用 IO 的所有操作都应该是异步的吗?

标签 c# io task-parallel-library async-await asp.net-mvc-5

当我阅读 MSDN 文章时 Using Asynchronous Methods in ASP.NET MVC 4 ,我得出结论,我应该始终对 I/O 绑定(bind)操作使用异步等待。

考虑以下代码,其中 movieManager 公开了像 Entity Framework 这样的 ORM 的异步方法。

public class MovieController : Controller
{
    // fields and constructors

    public async Task<ActionResult> Index()
    {
        var movies = await movieManager.listAsync();

        return View(movies);
    }

    public async Task<ActionResult> Details(int id)
    {
        var movie = await movieManager.FindAsync(id);

        return View(movie);
    }
}
  1. 这是否总能给我带来更好的可扩展性和/或性能?
    • 我该如何衡量?
  2. 为什么不在“现实世界”中使用它?
  3. 上下文同步怎么样?
    • 我不应该在 ASP.NET MVC 中使用异步 I/O 有那么糟糕吗?

我知道这些问题很多,但有关该主题的文献得出的结论相互矛盾。有人说您应该始终对 I/O 相关的任务使用异步,也有人说您根本不应该在 ASP.NET 应用程序中使用异步。

最佳答案

Will this always give me better scalability and/or performance?

有可能。如果您只有一个数据库服务器作为后端,那么您的数据库可能是您的可扩展性瓶颈,在这种情况下,扩展您的 Web 服务器不会对更广泛的服务范围产生任何影响。

How can I measure this?

带有负载测试。如果你想要一个简单的概念验证,你可以查看 this gist of mine .

Why isn't this used in the "real world" a lot?

是的。 .NET 4.5 之前的异步请求处理程序编写起来非常痛苦,许多公司只是投入更多的硬件来解决这个问题。现在 .NET 4.5 和 async/await 获得了很大的发展势头,异步请求处理将继续变得更加普遍。

How about context synchronization?

它由 ASP.NET 为您处理。我有一个 async intro在我的博客上解释了 await 如何在您 await 任务时捕获当前的 SynchronizationContext 。在这种情况下,它是代表请求的 AspNetSynchronizationContext,因此 HttpContext.Current、文化等都会自动保存在 await 点.

Is it that bad, that I shouldn't use async I/O in ASP.NET MVC?

作为一般规则,如果您使用的是 .NET 4.5,则应该使用 async 来处理任何需要 I/O 的请求。如果请求很简单(即不访问数据库或调用其他服务),则只需保持同步即可。

关于c# - 我使用 IO 的所有操作都应该是异步的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23227089/

相关文章:

c++ - 目标 : using the iomanip library to format screen output

c - 如何检测 scanf() 末尾的空格或换行符?

c# - 从 Task.Run 中抛出异常显示 "Not Handled from User Code"消息

c# - 使用字符串和整数 C# 的按钮数组

c# - 嵌套泛型

c# - 我应该将家庭视频转换为什么格式以用于网络和移动设备?

c# - 如何打破嵌套的foreach循环然后转到c#上的父foreach循环

使用文件输入和输出的 C 程序结构

c# - Async WebRequest 卡住应用程序

.net - 防止 IIS 在任务结束前杀死它