【问题标题】:Async calling with multiple contexts具有多个上下文的异步调用
【发布时间】:2015-10-30 09:32:37
【问题描述】:

所以我的代码伪类似于(依赖注入):

public DbContextA DBA { get; set; } // SQL Server 1
public DbContextB DBB { get; set; } // SQL Server 2

我现在才确定如何最有效地执行以下操作?

public Task<ActionResult> MyAction()
{
  var trucks = await DBA.GetTrucksAsync();
  var cars = DBA.GetCarsAsync();

  var cats = await DBB.GetCatsAsync();
  var dogs = DBB.GetDogsAsync();

  await TaskEx.WhenAll(cars, dogs);
}

除非我弄错了,否则这不是最佳选择。我认为能够这样做会很棒:

public Task<ActionResult> MyAction()
{
  IEnumerable<Truck> trucks;
  IEnumerable<Car> cars;
  IEnumerable<Cat> cats;
  IEnumerable<Dog> dogs

  var dba = Task.Run(async () => { trucks = await DBA.GetTrucksAsync(); } )
    .ContinueWith(async () => { cars = await DBA.GetCarsAsync(); } );

  var dbb = Task.Run(async () => { cats = await DBB.GetCatsAsync(); })
    .ContinueWith(async () => { dogs = await DBB.GetDogsAsync(); });

  await Task.WhenAll(dba, dbb);
}

但我目前无法对此进行测试(我很确定这是错误的)。

【问题讨论】:

  • Task.Run 在 ASp.NET 上会变得更糟,因为您将释放一个线程只是为了切换到具有相同特性的另一个线程。 `任务执行?你在哪个版本的框架上运行?
  • 您可以使用 AsyncController,如果您需要进行长时间运行的调用,它会更好一些,因为它会在等待响应的时间释放线程。
  • @PauloMorgado 是的,应该是Task。我知道Task.Run() 在那里展示了我正在尝试做的事情,而不是实际如何去做。
  • 不,应该没什么!

标签: asp.net-mvc async-await entity-framework-6 dbcontext


【解决方案1】:

只需添加几个方法来表示依赖项:

private async Task<Tuple<IEnumerable<Truck>, IEnumerable<Car>>> GetVehiclesAsync()
{
  var trucks = await DBA.GetTrucksAsync();
  var cars = await DBA.GetCarsAsync();
  return Tuple.Create(trucks, cars);
}

private async Task<Tuple<IEnumerable<Cat>, IEnumerable<Dog>>> GetAnimalsAsync()
{
  var cats = await DBB.GetCatsAsync();
  var dogs = await DBB.GetDogsAsync();
  return Tuple.Create(cats, dogs);
}

public Task<ActionResult> MyAction()
{
  var vehiclesTask = GetVehiclesAsync();
  var animalsTask = GetAnimalsAsync();
  await Task.WhenAll(vehiclesTask, animalsTask);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    相关资源
    最近更新 更多