我尝试对 SQL Server 进行异步数据库调用,并将其与新的 ASP.NET MVC 4 异步功能一起使用,但奇怪的是它根本没有返回。我调试了代码,运行良好,但不知何故 HTTP 请求永远挂起。
这是我做的:
这是数据库调用方法:
public async Task<IEnumerable<Car>> GetCarsAsync() {
var connectionString = ConfigurationManager.ConnectionStrings["CarGalleryConnStr"].ConnectionString;
var asyncConnectionString = new SqlConnectionStringBuilder(connectionString) {
AsynchronousProcessing = true
}.ToString();
using (var conn = new SqlConnection(asyncConnectionString)) {
using (var cmd = new SqlCommand()) {
cmd.Connection = conn;
cmd.CommandText = selectStatement;
cmd.CommandType = CommandType.Text;
conn.Open();
using (var reader = await cmd.ExecuteReaderAsync()) {
return reader.Select(r => carBuilder(r)).ToList();
}
}
}
}
这里,SqlDataReader
上的Select
方法是我实现的扩展方法。 carBuilder
私有(private)方法只返回一个 Car
类的实例。
这是 Controller 类:
public class HomeController : Controller {
private readonly GalleryContext ctx = new GalleryContext();
public async Task<ViewResult> IndexAsync() {
return View("Index", await ctx.GetCarsAsync());
}
}
知道我错过了什么吗?
最佳答案
您的 Controller 仍然需要从 AsyncController 派生(参见 Exercise 4: Using Asynchronous Controllers ),但现在您需要编写更少的代码来获得与 Task<T>
相同的结果。 .
所以这应该可行:
public class HomeController : AsyncController {
private readonly GalleryContext ctx = new GalleryContext();
public async Task<ViewResult> IndexAsync() {
return View("Index", await ctx.GetCarsAsync());
}
}
关于ASP.NET MVC 4 异步数据库调用 : never returns the HTTP response,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9983777/