task.run параллельно для c # - PullRequest
0 голосов
/ 20 сентября 2018

в настоящее время у меня есть следующий цикл foreach

foreach (var formId in formIdList)
        {
            var hasAccess = Task.Run(async () => await _userAccessService.HasAccessToFormId(formId)).Result;
            if (!hasAccess)
            {
                throw new UnauthorizedAccessException();
            }
        }

, пытающийся выяснить, как выполнить больше задач типа рода. Все, чтобы все функции могли работать параллельно и, если они есть, возвращали falseдля var hasaccess, затем выбросить несанкционированное исключение.

/ ************************** обновленный вопрос для токена отмены ************

используя решение 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 голосов
/ 20 сентября 2018

Как насчет этого, он будет выдавать первый неавторизованный идентификатор.Однако здесь нет средств для отмены другого запроса, поэтому они просто игнорируются.Я бы посоветовал работать в 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();
    }
}
...