gpt4 book ai didi

c# - 需要帮助检查用户并将其添加到多个异步角色

转载 作者:行者123 更新时间:2023-11-30 16:58:23 29 4
gpt4 key购买 nike

我正在使用 ASP.Net MVC 5 并正在创建一个 Controller 以允许经理将用户添加到角色。这是 Controller 的非异步版本的样子:

public JsonResult UerRoles(string userid, string[] roles)
{
foreach(var role in roles)
{
if(!UserManager.IsInRole(userid, role))
{
UserManager.AddToRole(userid, role);
}
}

...
}

我想使用 UserManager.IsInRoleAsync 和 UserManager.AddToRoleAsync 方法,并希望并行运行这些方法,然后停止线程的执行,直到一切都完成。我以前没有做过异步线程,但看起来我可以做这样的事情:

public async Task<JsonResult> UserRoles(string userid, string[] roles)
{
IList<Task<IdentityResult>> tasks = new List<Task<bool>>();
foreach(var role in roles)
{
tasks.Add(UserManager.AddToRoleAsync(userid, role));
}

await Task.WhenAll(tasks);

...
}

但是,我不知何故需要考虑检查用户是否已经在角色中的条件逻辑——即 UserManager.IsInRoleAsycn(userid, role)。我不确定如何检查并有条件地以并行和异步方式将用户添加到角色。

我已经看到提到的 ContinueWith 方法,它似乎以某种方式适用,但我无法弄清楚如何实现它。像这样的东西:

UserManager.IsInRoleAsync(userid, role).ContinueWith(t => if(t.Result) { UserManager.AddToRole(userid, role)} ;);

有没有办法做到这一点?

最佳答案

假设:您正在使用 AspNet Identity 的标准 EF 实现

您将必须使用以下代码:

foreach(var role in roles)
{
var isInRole = await UserManager.IsInRoleAsync(userid, role)
if(!isInRole)
{
await UserManager.AddToRoleAsync(userid, role);
}
}

这个底层ORM(Entity Framework)不支持并行线程执行sql查询的原因。如果你尝试这样做,你会从 EF 那里得到异常,说这样的话:

A second operation started on this context before a previous asynchronous operation completed. Use 'await' to ensure that any asynchronous operations have completed before calling another method on this context. Any instance members are not guaranteed to be thread safe.

This topic有一个很好的例子说明会发生什么。

此外,我怀疑将用户添加到角色是否是您系统中非常流行的操作。为什么要特意优化那些不会经常受到影响的东西?

更新

您不需要检查 IsUserInRole。无论如何,身份框架都会为你做这件事。这是反编译的身份框架的一部分:

public virtual async Task<IdentityResult> AddToRoleAsync(TKey userId, string role)
{
// sanity checks...

IList<string> userRoles = await userRoleStore.GetRolesAsync(user).ConfigureAwait(false);
IdentityResult identityResult;
if (userRoles.Contains(role))
{
identityResult = new IdentityResult(new string[1]
{
Resources.UserAlreadyInRole
});
}
else
{
// actually add user to role
}
return identityResult;
}

关于c# - 需要帮助检查用户并将其添加到多个异步角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25328255/

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