【问题标题】:Alternative to Task.RunTask.Run 的替代方案
【发布时间】: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


【解决方案1】:

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

是的。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2015-03-03
    • 2015-09-25
    • 2019-12-16
    • 2011-06-20
    • 2015-11-03
    • 2014-04-03
    相关资源
    最近更新 更多