我是 C# 任务的新手。我正在尝试遵循有关将 arm 模板部署到 azure 以启动虚拟机的示例: https ://azure.microsoft.com/en-us/documentation/articles/arm-template-deployment/
此处给出的第一个操作是通过调用 Active Directory 获取授权令牌。链接中给出的代码使用了似乎已弃用的 AcquireToken api,目前我只能找到 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 阻塞,直到acquireTokenTask 的状态变为“RanToCompletion”。但即使状态为“WaitingForActivation”时,WhenAll 没有阻塞,并且控制转到下一条语句,试图获取acquireTokenTask.Result。这会导致异常说明,异常详细信息说明发送请求时出错。
问题:
1、发送状态没有变为“RanToCompletion”的请求是否有错误?我认为情况并非如此,因为 10 次运行中有 2-3 次运行成功,状态为“RanToCompletion”,我能够得到结果。
2. 我认为 Task.WhenAll 会阻塞线程,直到它运行完成。这不是真的吗?如果为真,我想知道控件是如何传递给下一个语句的。
3. 如何解决这个问题,并在提取结果时每次运行都获得成功的结果?