我使用Microsoft.Graph仅针对Azure AD进行应用调用。 简而言之,我的代码如下(C#.NET 4.5):
Task userQueryTask = Task.Run(async () =>
{
IGraphServiceUsersCollectionPage users = await connection.GraphService.Users.Request().Select(userSelect).Filter(userFilter).GetAsync();
}, cts.Token);
Task groupQueryTask = Task.Run(async () =>
{
IGraphServiceGroupsCollectionPage groups = await connection.GraphService.Groups.Request().Select(groupSelect).Filter(groupFilter).GetAsync();
}, cts.Token);
Task.WaitAll(new Task[2] { userQueryTask, groupQueryTask }, Constants.timeout, cts.Token);
以下是我的问题:
谢谢
答案 0 :(得分:0)
在并行运行的2个任务中使用相同的GraphServiceClient对象是一个好习惯吗?
Robert Anderson回答Recommended lifetime for a GraphServiceClient instance:
Graph客户端对象是线程安全且可重入的。它是一个容器,包含用于通过构建器模式构造请求对象的配置,提供程序和帮助程序。
由于GraphServiceClient
是线程安全的,因此您可以跨多个线程重用相同的实例。 AFAIK,如果您创建了许多HttpClient
实例来访问相关的Graph API,您可能还需要重用一组实例,否则您可能会遇到内存泄漏问题。
我应该尝试改进这一点并避免两个任务都获得访问令牌吗?
根据我的经验,您最好使用相同的access_token,而不是为每项任务生成令牌。此外,您可以创建一个TokenHelper
类来缓存获取的access_token并记录过期时间。在GetTokenAsync
方法下,您需要验证当前的access_token(如果为null,则获取新令牌;如果令牌即将过期,则再次获取新令牌)。
var graphClient = new GraphServiceClient(
"https://graph.microsoft.com/v1.0",
new DelegateAuthenticationProvider(
async (requestMessage) =>
{
var token = await TokenHelper.GetTokenAsync();
requestMessage.Headers.Authorization = new AuthenticationHeaderValue("bearer", token);
}));
注意: TokenHelper.GetTokenAsync
方法可能需要是线程安全的。