我有一系列异步方法,希望同时执行。每个方法都会返回执行成功或失败的true或false,并在审计跟踪中记录结果,以便我们诊断问题。
有些函数并不依赖于所有这些方法的成功执行,并且我们完全预期其中一些会时不时地失败。如果它们失败了,程序将继续执行,并仅向我们的支持人员发出警报,告知需要纠正该问题。
我试图找出最佳方法来让所有这些函数同时执行,但只有在它们全部开始执行后,父函数才等待它们。如果任何一个函数失败,父函数将返回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秒。但是,这将被扩展到最终多次调用该父函数(批量插入)。
Task.WhenAll
。就结果值而言,如果不知道涉及的类型的一半,很难确定。 - Jon Skeet