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();
}
}

试图弄清楚如何做更多的任务.whenall构造,以便所有函数都可以并行运行,如果有任何为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();
}
}

最新更新