调用 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;
}
我是 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;
}