Я новичок в задачах на С#. Я пытаюсь следовать примеру развертывания шаблона руки в 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. Как я могу решить эту проблему и получить успешный результат при каждом запуске к моменту извлечения результата?
Task.WhenAll
асинхронно уступит, аTask.WaitAll
заблокирует. Но почему вы хотите заблокировать? Если вы правильноawait
всю цепочку вызовов, все будет в порядке. 27.08.2015Task.Result
вместоawait
27.08.2015Task.WhenAll
, а не об ожидании звонкаAcquireTokenAsync
. Я считаю крайне маловероятным преждевременный возврат, поскольку если у вас есть доступ к свойствуToken
, это означает, что возвращенная задача завершена. 25.04.2017