Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在一个请求期间,过多的异步/等待会导致挂起Linux上的ASP.NET Core 3.0_C#_Async Await_Azure Web App Service_Asp.net Core 3.0 - Fatal编程技术网

C# 在一个请求期间,过多的异步/等待会导致挂起Linux上的ASP.NET Core 3.0

C# 在一个请求期间,过多的异步/等待会导致挂起Linux上的ASP.NET Core 3.0,c#,async-await,azure-web-app-service,asp.net-core-3.0,C#,Async Await,Azure Web App Service,Asp.net Core 3.0,我无法提供有关我们的web应用程序的具体细节,但通过发布此问题,我希望有人能为我指明正确的方向 我们有一个Web API,它有一个粗粒度的请求,从DB和Azure表存储中获取大量数据。它是在Azure AppService(Web应用)中的Windows上的ASP.NET Core 2.2上运行的,到目前为止我们还没有遇到任何问题。Web客户端调用此请求,用户希望该请求持续10-20秒,因为它一次加载一堆数据。他们每天提出2-3次这样的要求。这很好 上周,我们更新了代码,使其在ASP.NET C

我无法提供有关我们的web应用程序的具体细节,但通过发布此问题,我希望有人能为我指明正确的方向

我们有一个Web API,它有一个粗粒度的请求,从DB和Azure表存储中获取大量数据。它是在Azure AppService(Web应用)中的Windows上的ASP.NET Core 2.2上运行的,到目前为止我们还没有遇到任何问题。Web客户端调用此请求,用户希望该请求持续10-20秒,因为它一次加载一堆数据。他们每天提出2-3次这样的要求。这很好

上周,我们更新了代码,使其在ASP.NET Core 3.0上运行,并将宿主更改为在Linux上的Azure AppService(Web App)P2V2层(7GB RAM和2个内核)下运行

我们正在经历的问题是,有时候这个请求永远不会返回响应。它是非常随机的——有时它会返回,但可能有六分之一的时间它无法返回响应。没有抛出异常,应用程序洞察中没有任何异常。没有什么。沉默。web客户端最终会在4分钟后超时请求。而且它也不会在重载下发生。不可能有任何请求进入服务器,只有这一个请求,它碰巧挂起

通过跟踪消息,我发现挂起总是发生在针对DB的同一个“wait”查询上。我认为EF Core有问题(我们现在使用3.0)。我认为这是一个问题,因为AsNoTracking调用或ProjectTo(来自AutoMapper)。尝试了多种方法-同一问题。我删除了wait调用,从ToListAsync改为普通的旧ToList,然后在接下来的“wait”查询中突然出现了挂起。通过多次测试,我再次确认它总是发生在同一个“异步”查询上。当它挂起时,它总是挂在第五个“等待”线上。现在,我删除了第4次之后所有EF查询中的“等待”调用,并将ToListSync替换为ToList。现在,接下来的“等待”是对Azure表存储的调用,正如您可能已经猜到的,再次挂起

因此,我决定从这个API请求中删除所有“async/await”,并用同步调用替换它们。到目前为止,还没有报告任何问题


如果有人能给我一些关于这种行为原因的建议,我将不胜感激

为了清楚起见,我希望这是“一路异步”,您永远不会同步地等待异步函数?您可以提供源代码吗?如果您可以创建一个复制,您可以在适当的repo上打开一个问题(取决于它是在运行时、库还是其他任何地方)。这是一个有趣的故事,但没有任何人可以采取行动。“正确的方向”可能是重写,也可能是bug搜索,或者某个物理主机某处的内存芯片坏了(不太可能,但奇怪的事情发生了)。即使是一个“我想我看到过类似的事情”的故事也可能完全是一个骗局。我和@HansKesting在一起。这是同步等待异步方法的典型症状。但我们需要看一些代码才能确定地告诉你任何事情。有一次,我遇到了一个类似的问题,一些查询只是让一切停止,然后挂起等待infinty。经过大量的搜索,我可以看到我查询的表被另一个服务锁定,所以我的应用程序会等待表被解锁,这永远不会发生,所以它会永远挂起。当它挂起时,我关闭了带有锁定表的服务,它返回了结果。不确定这是否是您的情况,但请检查某个表是否未锁定。我不是DB方面的专家,现在已经知道如何锁定或解锁表,但希望这能有所帮助。