小编Joh*_*ens的帖子

Microsoft.Graph GetAsync() 无限期挂起

介绍

我正在开发一个 ASP.NET 应用程序,除其他外,它应该从 Azure Active Directory 检索用户。为此,我使用了 Microsoft Graph 1.14.0 版预览库,可在此处找到。

由于该库仅提供用于检索用户的异步方法,因此我使用以下(伪)代码来同步运行它。

string userPrincipalName = "test.user@intuneforeducation.com";
var task = Task.Run(async () => await _graphServiceClient.Users[userPrincipalName].Request().GetAsync());

while (!task.IsCompleted)
     Thread.Sleep(200);

User retrievedUser = task.Result;
Run Code Online (Sandbox Code Playgroud)

问题

我现在面临的问题是,在从 ASP.NET 应用程序调用这段代码时,task.IsCompleted永远保持false. 现在这是我无法理解的奇怪部分:代码在控制台应用程序和单元测试(使用 NUnit)中完美运行。

有人可能认为 GraphServiceClient 实例在这些版本中的构建方式不同,但我 100% 肯定它不是。组成它的信息是从数据库中加载的,单元测试中的代码与 ASP.NET 应用程序的控制器中的代码完全相同。使用单元测试,上述代码在大约 1.5 秒内执行完毕。在 ASP.NET 应用程序中,我让它运行了长达 30 分钟,没有任何结果,没有错误,没有超时,什么也没有。

我意识到这可能是一个小众问题,但我确实希望有人遇到同样的问题并能够解决它。

更新

我设法解决了这个问题。奇怪的是,将我所有的方法转换为异步任务并没有奏效,甚至await一直挂着。然而,我不完全理解为什么我的解决方案现在有效。看起来我的伪代码并不完全准确,解决方案就在其中。

尝试 #1(不起作用)

此代码永远保留在while (!runTask.IsCompleted).

object GetResult<TResult>(Task<TResult> task)
{
    using (task)
    using (var runTask = …
Run Code Online (Sandbox Code Playgroud)

c# active-directory azure microsoft-graph-api

7
推荐指数
1
解决办法
2577
查看次数

C#如何使用LINQ将List拆分为两个

我试图使用LINQ将List拆分为两个列表,而不是两次迭代'master'列表.一个List应包含LINQ条件为true的元素,另一个应包含所有其他元素.这是可能吗?

现在我只使用两个LINQ查询,因此两次迭代(巨大的)主列表.

这是我现在使用的(伪)代码:

List<EventModel> events = GetAllEvents();

List<EventModel> openEvents = events.Where(e => e.Closer_User_ID == null);
List<EventModel> closedEvents = events.Where(e => e.Closer_User_ID != null);
Run Code Online (Sandbox Code Playgroud)

是否可以在不重复原始List两次的情况下产生相同的结果?

c# linq performance split list

6
推荐指数
3
解决办法
623
查看次数