调用 Azure ActiveDirectory 时的任务状态 WaitingForActivation

Task status WaitingForActivation on call to Azure ActiveDirectory

我是 C# 中的任务的新手。我正在尝试按照有关将 arm 模板部署到 azure 以启动虚拟机的示例进行操作: https://azure.microsoft.com/en-us/documentation/articles/arm-template-deployment/

这里给出的第一个操作是通过调用 Active Directory 获取授权令牌。 link 中给出的代码使用 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;
}

我原以为在 acquireTokenTask 的状态变为 "RanToCompletion" 之前会出现 thatTask.WhenAll 个阻塞。但即使状态为 "WaitingForActivation",WhenAll 也不会阻塞,并且控制会转到下一个语句以尝试获取 acquireTokenTask.Result。这导致异常说明,异常详细信息说明发送请求时出错。

问题:
1.发送请求状态没有变化到"RanToCompletion"是否有错误?我认为情况并非如此,因为 10 个 运行 中有 2-3 个 运行 成功获得状态 "RanToCompletion",并且我能够得到结果。
2. 我认为 Task.WhenAll 会阻塞线程直到它 运行 完成。这不是真的吗?如果为真,我想知道控件是如何传递到下一个语句的。
3. 如何解决此问题并在提取结果时在每个 运行 上获得成功结果?

I thought Task.WhenAll blocks the thread until it runs to completion. Is this not true?

Task.WhenAll returns 等待,您需要 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;
}