【发布时间】:2014-10-09 07:08:28
【问题描述】:
我正在使用 ASP.Net MVC 5 并正在创建一个控制器以允许经理将用户添加到角色。这是控制器的非异步版本的样子:
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)} ;);
有没有办法做到这一点?
【问题讨论】:
-
我认为你根本不需要使用
Tasks。等待Async方法 -
WhenAll不会并行运行任务。为此,您实际上必须为每个任务生成一个新线程,这首先违背了异步的目的。
标签: c# asp.net asp.net-mvc asynchronous asp.net-identity