我有一个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更好吗?
答案 0 :(得分:3)
2)使方法比使用Task.Run更好吗?
是
在这种情况下,由于您没有EF6提供的自然 - 异步API,下一个最佳解决方案是同步。
请注意,即使您确实拥有异步API,单个DbContext
仍然只能一次处理一个操作。您必须创建多个上下文才能运行多个同步查询,这可能会变得复杂。