异步多上下文调用 [英] Async calling with multiple contexts

查看:251
本文介绍了异步多上下文调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我有code伪相似(依赖注入):

So I have code pseudo-similar to (dependency injected):

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

我刚才知道我怎么能最有效地执行下列操作?

I'm just now sure how I can most effectively do the following?

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);
}

除非我记错了,这是不是最佳的。我认为这将是伟大的,是能够做到:

Unless I'm mistaken this isn't optimal. I think it would be great to be able to do:

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);
}

但我不能在目前测试这个(我pretty确保它是错的)。

But I can't test this at the moment (and I'm pretty sure it's wrong).

推荐答案

只需添加一对夫妇的方法来重新present的依赖关系:

Just add a couple methods to represent the dependencies:

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);
}

这篇关于异步多上下文调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆