为C#并行运行task。

时间:2018-09-20 15:20:46

标签: c# asp.net async-await task

目前,我有以下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();
        }
    }

1 个答案:

答案 0 :(得分:0)

如何处理,它将引发第一个未经授权的ID。但是,这里没有取消其他请求的方法,因此它们将被忽略。我建议您使用CancellationToken来取消其他任务,因为您并不关心结果,至少不关心它们的完成。

await