c# - task.run 为 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();
}
}
推荐阅读
- localization - 为什么我的 laravel 控制器在使用 App::setLocale() 时会冻结?
- java - 找不到带有微调器的符号方法 setText() 和 getText()
- elasticsearch - 如何解析 fluent-bit json $log。
钥匙? - ffmpeg - 提取视频文件头信息
- asp.net - URL 在返回 Page() 时自动将斜杠解析为 %2F
- mysql - X 与 Y 无关(Sequelize / ExpressJS)
- assembly - Gas 不会将 64 位移动到 %rbx,但对于 %rax (x86/64) 会这样做
- html - Typescript - 单击元素时如何更改按钮位置?
- java - 检查接口是否正在使用反射在 Java 中扩展另一个接口
- after-effects - After Effects:使用 createPath 将图层坐标转换为形状图层坐标