在 API 中使用任务并行库

Using Task Parallel Library in API

我有一个方法,我想 运行 三个并行查询。我正在尝试使用 Task Parallel 库来执行此操作,如图所示:

        internal static async Task<RequestAppointmentDBMasterObject> GetDAMasterObject(string facility, string sites, string state)
        {
            
            RequestAppointmentDBMasterObject mo = new RequestAppointmentDBMasterObject();

            string querySites = query1;
            string queryPractitioners = query2;
            string queryExistingAppts = query3;

        using (IDbConnection db = new OdbcConnection(connectionString))
        {
            await Task.Run(() =>
            {
                Parallel.Invoke(
                    () => { mo.SiteList = db.Query<Sites>(querySites).ToList(); },
                    () => { mo.PractitionerList = db.Query<Practitioners>(queryPractitioners).ToList(); },
                    () => { mo.ExistingAppointments = db.Query<AvailResponseObject>(queryExistingAppts).ToList(); }
                );
            });
        }

            return mo;
        }

然后,在另一个 class 上,我调用此方法来设置我要使用的对象,如下所示:

        RequestAppointmentDBMasterObject mo = DataAccess.GetDAMasterObject(facility, site, state).Result;

问题是当我调用 API 时我从来没有得到返回结果。一旦我将所有内容改回不使用任务和并行库。一切正常。 我还在控制台应用程序中尝试了同样的代码,我得到了数据。我不确定为什么我可能会缺少代码,所以我可以在我的 API 上使用它。 提前谢谢你。

这比需要的要复杂得多。让任务层包裹其他任务通常不是正确的方法。

您最好将这三个查询作为异步操作执行(即它们 return Task<T>,然后并行等待它们:

var t1 = db.QueryAsync(...);
var t2 = db.QueryAsync(...);
var t3 = db.QueryAsync(...);

await Task.WhenAll(t1, t2, t3);

这取决于支持多个并发连接的数据库连接(这通常不是真的)。​​

使用 t1.Result 等获取 returned 值。

如评论中所述,您根本不想使用 Parallel。相反,使用异步并发 (await Task.WhenAll).

但是,大多数数据库提供商不允许通过同一数据库连接同时发出多个请求。因此,您 可能 需要三个不同的数据库连接以同时 运行 三个查询。

internal static async Task<RequestAppointmentDBMasterObject> GetDAMasterObject(string facility, string sites, string state)
{
  RequestAppointmentDBMasterObject mo = new RequestAppointmentDBMasterObject();
  string querySites = query1;
  string queryPractitioners = query2;
  string queryExistingAppts = query3;

  using (IDbConnection db1 = new OdbcConnection(connectionString))
  using (IDbConnection db2 = new OdbcConnection(connectionString))
  using (IDbConnection db3 = new OdbcConnection(connectionString))
  {
    var task1 = db1.Query<Sites>(querySites).ToListAsync();
    var task2 = db2.Query<Practitioners>(queryPractitioners).ToListAsync();
    var task3 = db3.Query<AvailResponseObject>(queryExistingAppts).ToListAsync();
    await Task.WhenAll(task1, task2, task3);
    mo.SiteList = await task1;
    mo.PractitionerList = await task2;
    mo.ExistingAppointments = await task3;
  }
  return mo;
}

像这样进行多个并发查询是 可能的 ,但通常最好进行一次 单个 查询以一次性恢复所有内容.这样你只需要一个数据库连接,所有的查询结果都是一致的。