Task.Run的替代方案

时间:2014-12-12 10:42:51

标签: c# asp.net-mvc asynchronous async-await asp.net-4.5

我有一个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更好吗?

1 个答案:

答案 0 :(得分:3)

  

2)使方法比使用Task.Run更好吗?

在这种情况下,由于您没有EF6提供的自然 - 异步API,下一个最佳解决方案是同步。

请注意,即使您确实拥有异步API,单个DbContext仍然只能一次处理一个操作。您必须创建多个上下文才能运行多个同步查询,这可能会变得复杂。