我有一系列我想同时执行的异步方法。这些方法中的每一个都会返回true或false,以确定它们是否成功执行。他们的结果也记录在我们的审计线索中,以便我们可以诊断问题。同时执行所有任务并等待完成?
我的一些函数并不依赖于所有这些方法的执行成功,我们完全期望其中的一些方法会不时失败。如果他们确实失败了,该计划将继续执行,只会提醒我们的支持人员他们需要纠正问题。
我想弄清楚什么是所有这些功能同时执行的最佳方法,但只有在它们全部开始执行后,父功能才会等待它们。如果任何函数失败,父函数将返回False
,这将提醒我的应用程序停止执行。
我的想法是做类似的东西:
public async Task<bool> SetupAccessControl(int objectTypeId, int objectId, int? organizationId)
{
using (var context = new SupportContext(CustomerId))
{
if (organizationId == null)
{
var defaultOrganization = context.Organizations.FirstOrDefault(n => n.Default);
if (defaultOrganization != null) organizationId = defaultOrganization.Id;
}
}
var acLink = AcLinkObjectToOrganiation(organizationId??0,objectTypeId,objectId);
var eAdmin = GrantRoleAccessToObject("eAdmin", objectTypeId, objectId);
var defaultRole = GrantRoleAccessToObject("Default", objectTypeId, objectId);
await acLink;
await eAdmin;
await defaultRole;
var userAccess = (objectTypeId != (int)ObjectType.User) || await SetupUserAccessControl(objectId);
return acLink.Result && eAdmin.Result && defaultRole.Result && userAccess;
}
public async Task<bool> SetupUserAccessControl(int objectId)
{
var everyoneRole = AddToUserRoleBridge("Everyone", objectId);
var defaultRole = AddToUserRoleBridge("Default", objectId);
await everyoneRole;
await defaultRole;
return everyoneRole.Result && defaultRole.Result;
}
是否还有更好的选择吗?我应该以任何方式重组吗?我只是试图加快执行时间,因为我有一个父函数可以执行接近20个彼此独立的其他函数。即使速度最慢,没有异步,执行只需要大约1-2秒。然而,这将被放大以最终使该父呼叫执行数百次(批量插入)。
我曾经使用Parallel.Invoke这个东西。 –
你可能想看看'Task.WhenAll'。对于结果值,很难说不知道涉及的一半类型...... –
幸运的是,如果我不需要将值传递给父级(或等待它们用于其他函数),则所有函数将返回一个真实或错误的价值。 –