0

我面临一个难以重现的问题,我认为这与使用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 以使它们消失。

任何可能发生的事情的线索?

4

1 回答 1

1

canceltoken 不指示取消,实施者可能会在很长一段时间后检查它,或者完全忽略它。实现超时的正确方法是:

if(yourTask == Task.WhenAny(yourTask, Task.Delay(3000)))
{
   //task completed
}
else
{
  //timeout occured
}
于 2013-07-29T19:50:23.417 回答