我面临一个难以重现的问题,我认为这与使用CancellationToken
. 我有三个异步应用程序(每个都在不同的服务器上),它们通过 ASP.NET Web API 进行通信,如下图所示
A ---> B ---> C
AppA
不时运行一个例程,该例程向 app 触发大量并发请求B
,这反过来又向 app 触发另一批并发请求C
。所有这些调用都是使用 完成的HttpClient.SendAsync
,并且被限制为 10 秒超时,使用CancellationToken
如下:
var cancellationTokenSource = new CancellationTokenSource();
cancellationTokenSource.CancelAfter(TimeSpan.FromSeconds(10));
var token = cancellationTokenSource.Token;
当服务器C
负载过重时,它开始花费更多时间来响应,这导致服务器B
开始取消请求——因为配置了超时。发生这种情况时,有时请求会“卡住”(见下图)。
我熟悉 C# 异步最佳实践,但我不做.Result
之.Wait()
类的。我知道这些可能会导致挂起。
如果我通过CancellationToken.None
了,问题就消失了,所以我的提示是它与高并发情况下的取消有关。
随着时间的流逝,越来越多的请求开始挂起,最终我别无选择,只能重置 IIS 以使它们消失。
任何可能发生的事情的线索?