Squeak.ru - шаблоны программирования

Состояние задачи WaitingForActivation при вызове Azure ActiveDirectory

Я новичок в задачах на С#. Я пытаюсь следовать примеру развертывания шаблона руки в Azure для запуска виртуальной машины: https://azure.microsoft.com/en-us/documentation/articles/arm-template-deployment/

Одной из первых приведенных здесь операций является получение маркера авторизации путем вызова Active Directory. Код, указанный в ссылке, использует API-интерфейс AcquireToken, который кажется устаревшим, и в настоящее время я могу найти только AcquireTokenAsync. Поэтому я изменил код, чтобы создать задачу и дождаться ее завершения:

private static string GetAuthorizationHeader()
{
    ClientCredential cc = new ClientCredential("{application-id}", "{password}");
    var context = new AuthenticationContext("https://login.windows.net/{tenant-id}");

    Task<AuthenticationResult> acquireTokenTask = context.AcquireTokenAsync("https://management.azure.com/", cc);
    Task.WhenAll(acquireTokenTask);
    AuthenticationResult result = acquireTokenTask.Result;
    if (result == null)
    {
      throw new InvalidOperationException("Failed to obtain the JWT token");
    }

    string token = result.AccessToken;

    return token;
}

Я ожидал, что thatTask.WhenAll блокируется до тех пор, пока статус acceptTokenTask не станет «RanToCompletion». Но даже если статус «WaitingForActivation», WhenAll не блокируется, и управление переходит к следующему оператору, пытающемуся получить AcquiTokenTask.Result. Это приводит к исключению, в котором говорится, что при отправке запроса произошла ошибка.

Вопросы:
1. Есть ли ошибка при отправке запроса о том, что статус не меняется на "RanToCompletion"? Я не думаю, что это так, поскольку 2-3 запуска из 10 выполняются успешно со статусом "RanToCompletion", и я могу получить результат.
2. Я думал, что Task.WhenAll блокирует поток, пока он не запустится. до завершения. Разве это не правда? Если это правда, мне интересно, как управление передается следующему оператору.
3. Как я могу решить эту проблему и получить успешный результат при каждом запуске к моменту извлечения результата?


Ответы:


1

Я думал, что Task.WhenAll блокирует поток, пока он не завершится. Разве это не правда?

Task.WhenAll возвращает ожидаемое значение, которое вам нужно await включить. В настоящее время вы передаете свой Task, но не ждете, что просто заставляет код продолжать выполнение, пока вы не заблокируете его с помощью Task.Result. Хотя, это вовсе не nessacery здесь. WhenAll предназначен для использования, когда у вас есть несколько задач, которые необходимо асинхронно ожидать. Здесь вы можете просто ждать на сингле Task:

private static async Task<string> GetAuthorizationHeaderAsync()
{
    ClientCredential cc = new ClientCredential("{application-id}", "{password}");
    var context = new AuthenticationContext("https://login.windows.net/{tenant-id}");

    AuthenticationResult result = await context.AcquireTokenAsync(
                                            "https://management.azure.com/", cc);
    if (result == null)
    {
        throw new InvalidOperationException("Failed to obtain the JWT token");
    }

    string token = result.AccessToken;
    return token;
}
27.08.2015
  • Я хочу, чтобы поток был заблокирован. Похоже, мне нужно Task.WaitAll. Потому что, если я использую ожидание, вызывающий поток может вернуться, а другой поток может продолжить работу. Пожалуйста, поправьте меня, если я ошибаюсь: Task.WhenAll(taskInstance) == await taskInstance != Task.WaitAll(taskInstance). Task.WaitAll блокирует поток, верно? 27.08.2015
  • @Romonov Task.WhenAll асинхронно уступит, а Task.WaitAll заблокирует. Но почему вы хотите заблокировать? Если вы правильно await всю цепочку вызовов, все будет в порядке. 27.08.2015
  • Функция, вызывающая это, является Main, а компилятор Visual Studio не позволяет помещать await в Main. Вот и хочу заблокировать. 27.08.2015
  • @Romonov Хорошо, это особый случай. Вы можете использовать Task.Result вместо await 27.08.2015
  • Этот ответ касается только одного из вопросов. Судя по предоставленному коду, ДОЛЖНО быть достаточно ожидания вызова AcquireTokenAsync. Это не так, и это по-прежнему приводит к проблеме, которая подразумевается в вопросе 1. Я правильно применил await к моему вызову, но он все еще продолжается, когда статус возвращаемого токена — WaitingForActivation, а не RanToCompletion. Я только хотел бы, чтобы у меня был ответ, но я должен подозревать ошибку в вызове AcquireTokenAsync, который возвращает ДО того, как он получает токен !!! 25.04.2017
  • @RobVonNesselrode Этот ответ отвечает на все вопросы. ОП спрашивал о Task.WhenAll, а не об ожидании звонка AcquireTokenAsync. Я считаю крайне маловероятным преждевременный возврат, поскольку если у вас есть доступ к свойству Token, это означает, что возвращенная задача завершена. 25.04.2017
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...