在 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;
}
像这样进行多个并发查询是 可能的 ,但通常最好进行一次 单个 查询以一次性恢复所有内容.这样你只需要一个数据库连接,所有的查询结果都是一致的。
我有一个方法,我想 运行 三个并行查询。我正在尝试使用 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;
}
像这样进行多个并发查询是 可能的 ,但通常最好进行一次 单个 查询以一次性恢复所有内容.这样你只需要一个数据库连接,所有的查询结果都是一致的。