【发布时间】:2014-12-12 10:42:50
【问题描述】:
我有一个 ASP.NET MVC 4 程序,我编写了以下代码,我想让 Results() 方法异步:
public async Task<ActionResult> Results()
{
var result1 = SomeMethodAsync(1);
var result2 = SomeMethodAsync(2);
var result3 = SomeMethodAsync(3);
await Task.WhenAll(result1, result2, result3);
ViewBag.Result1 = result1;
ViewBag.Result2 = result2;
ViewBag.Result3 = result3;
return View()
}
public async Task<int> SomeMethodAsync(int i)
{
//do some logic
//make db call
return await Task.Run( () => DbCall(i));
}
public int DbCall(i)
{
//make db call
return valueFromDb;
}
由于我没有使用 Entityframework 6,我无法使 DbCall() 异步。 I was reading 在 ASP.NET 项目中使用 Task.Run 不是一个好主意,因为 Task.Run 将从 ASP.Net 线程池借用一个线程,因此可能会导致大量请求的排队问题(因为会有用于处理传入请求的可用线程数较少)。
1) 如何在不使用 Task.Run 的情况下使我的方法异步?
2) 使方法同步比使用 Task.Run 更好吗?
【问题讨论】:
-
您的
DbCall是做什么的?几乎每个 ado.net 提供程序都提供异步操作。你可以使用它。 -
它在一个 id (db.Departments.Find(id)) 上调用一个查找。不幸的是,我使用的是不提供异步调用的 Entityframework 4.3。只有 EF6 提供异步调用,但我目前无法升级到 EF6。
-
如果您在 SomeMethodAsync() 中的逻辑不包含任何 i/o 绑定的东西,那么使用同步代码可能会更好、更简单
标签: c# asp.net-mvc asynchronous async-await asp.net-4.5