[英]Task.Run vs Task.WhenAll vs Parallel.Invoke vs others: Run tasks in parallel and Get result in C#
[英]task.run in parallel for c#
目前我有以下foreach循环
foreach (var formId in formIdList)
{
var hasAccess = Task.Run(async () => await _userAccessService.HasAccessToFormId(formId)).Result;
if (!hasAccess)
{
throw new UnauthorizedAccessException();
}
}
试图弄清楚如何执行更多的任务。在进行各种构造时,所有功能可以并行运行,并且如果有任何返回var hasaccess的false,则抛出未授权的异常。
/ **************************更新了取消令牌的问题************
使用下面的jstewards解决方案。 有点不确定如何使用取消令牌(很抱歉,我更像是前端开发人员,所以在这里有点超出我的意思了)
如何使用令牌取消正在运行的任务?
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
var formIdList = AttributeRequestHelper.GetFormIdList(filterContext.ActionArguments);
CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;
Task.Run(async () => await CheckIds(formIdList),token);
}
public async Task CheckIds(IEnumerable<int> formIdList)
{
var results = formIdList.Select(id => _userAccessService.HasAccessToFormId(id)).ToList();
while (results.Any())
{
var result = await Task.WhenAny(results);
results.Remove(result);
var authorized = await result;
if (!authorized) throw new UnauthorizedAccessException();
}
}
怎么样,它将抛出第一个未经授权的ID。 但是,这里没有取消其他请求的方法,因此它们将被忽略。 我建议您使用CancellationToken
来取消其他任务,因为您并不关心结果,至少要await
它们的完成。
public async Task CheckIds(IEnumerable<int> formIdList)
{
var results = formIdList.Select(id => _userAccessService.HasAccessToFormId(id)).ToList();
while (results.Any())
{
var result = await Task.WhenAny(results);
results.Remove(result);
var authorized = await result;
if (!authorized) throw new UnauthorizedAccessException();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.