任务状态在调用Azure ActiveDirectory时等待激活
本文关键字:等待 激活 ActiveDirectory Azure 状态 调用 任务 | 更新日期: 2023-09-27 18:10:11
我是c#任务的新手。我正试图遵循关于部署手臂模板到azure启动虚拟机的示例:https://azure.microsoft.com/en-us/documentation/articles/arm-template-deployment/
这里给出的第一个操作之一是通过调用Active Directory获得授权令牌。链接中给出的代码使用了似乎已弃用的AcquireToken api,目前我只能找到AcquireTokenAsync。因此,我修改了代码以创建一个Task并等待它完成:
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;
}
我正等着那个任务呢。WhenAll阻塞,直到acquireTokenTask的状态变为"RanToCompletion"。但是,即使当状态为"WaitingForActivation"时,WhenAll没有阻塞,并且控件转到下一个语句,试图获得acquireTokenTask.Result。这将导致一个带有异常详细信息的异常,说明发送请求出错。
问题:
1. 发送状态未更改为"RanToCompletion"的请求时是否存在错误?我不认为是这种情况,因为10次运行中有2-3次运行成功,状态为"RanToCompletion",我能够得到结果。
2. 我想任务。WhenAll阻塞线程,直到它运行完成。这不是真的吗?如果为真,我想知道控制是如何传递到下一个语句的。
3.如何解决此问题并在提取结果时每次运行都获得成功的结果?
我想任务。WhenAll阻塞线程,直到它运行完成。这不是真的吗?
Task.WhenAll
返回一个可等待对象,您需要将其await
打开。目前,你通过你的Task
,但不等待,这只是使代码继续执行,直到你用Task.Result
阻止它。不过,这在这里完全没有必要。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;
}