gpt4 book ai didi

c# - 同时执行所有任务并等待它们完成?

转载 作者:太空狗 更新时间:2023-10-29 23:06:28 24 4
gpt4 key购买 nike

我有一系列我想同时执行的异步方法。这些方法中的每一个都返回 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 秒。然而,这将被扩展到最终让父调用执行数百次(批量插入)。

最佳答案

异步方法有一个同步部分,这是在到达未完成任务的第一个等待之前的部分(如果没有,则整个方法同步运行)。该部分使用调用线程同步执行。

如果您想在不并行化这些部分的情况下同时运行这些方法,只需调用这些方法,收集任务并使用 Task.WhenAll 一次等待所有任务。当所有任务完成后,您可以查看单个结果:

async Task<bool> SetupUserAccessControlAsync(int objectId)
{
var everyoneRoleTask = AddToUserRoleBridgeAsync("Everyone", objectId);
var defaultRoleTask = AddToUserRoleBridgeAsync("Default", objectId);

await Task.WhenAll(everyoneRoleTask, defaultRoleTask)

return await everyoneRoleTask && await defaultRoleTask;
}

如果您确实想要并行化该同步部分,那么您需要多个线程,因此不要简单地调用异步方法,而是使用 Task.Run 卸载到 ThreadPool主题:

async Task<bool> SetupUserAccessControlAsync(int objectId)
{
var everyoneRoleTask = Task.Run(() => AddToUserRoleBridgeAsync("Everyone", objectId));
var defaultRoleTask = Task.Run(() => AddToUserRoleBridgeAsync("Default", objectId));

await Task.WhenAll(everyoneRoleTask, defaultRoleTask)

return await everyoneRoleTask && await defaultRoleTask;
}

如果您的所有方法都返回 bool,您可以将所有任务收集到一个列表中,从 Task.WhenAll 中获取结果并检查是否所有返回的 true:

async Task<bool> SetupUserAccessControlAsync(int objectId)
{
var tasks = new List<Task<bool>>();
tasks.Add(AddToUserRoleBridgeAsync("Everyone", objectId));
tasks.Add(AddToUserRoleBridgeAsync("Default", objectId));

return (await Task.WhenAll(tasks)).All(_ => _);
}

关于c# - 同时执行所有任务并等待它们完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32952704/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com