【发布时间】:2015-10-06 00:28:43
【问题描述】:
我有一系列想要同时执行的异步方法。这些方法中的每一个都返回 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。对于结果值,如果不知道所涉及的一半类型,就很难判断... -
幸运的是,如果我不需要将值传递给父级(或等待它们在另一个函数中使用),所有函数都将返回 true 或 false 值。
标签: c# .net asynchronous async-await task-parallel-library